将 ASP.NET 应用迁移到容器的挑战 #3 – OpenSSL 问题





5.00/5 (2投票s)
配置 OpenSSL 最低版本和旧的重新协商
引言
在最近的一个项目中,需要将托管在 Windows 上的现有 ASP.NET 应用迁移到 Linux Docker 容器。 在整个迁移过程中,出现了很多挑战,并且花费了大量时间。 在本文中,以及后续标题类似的帖子中,我将简要概述遇到的一些关键挑战。 其中一个挑战是 OpenSSL 旧的重新协商。
鸣谢:https://turnoff.us/geek/we-need-to-talk-about-ssl/
简而言之
在目标运行时容器的 Dockerfile 中添加以下行,在运行应用程序入口点之前,以启用旧的 SSL 重新协商并更改允许的最低 TLS 版本。
RUN sed -i 's/CipherString = DEFAULT:@SECLEVEL=2/CipherString = DEFAULT:@SECLEVEL=1\n\
MinProtocol = TLSv1\n\
Options =UnsafeLegacyRenegotiation,UnsafeLegacyServerConnect\n\
/' /etc/ssl/openssl.cnf
详细说明
在将其中一个连接到大量第三方应用的 ASP.NET Windows 应用程序迁移到 Linux 期间,我们在建立与其中一些应用的连接时遇到了许多问题。 这些问题大多显示 SSL 异常,而我们遇到的主要异常是
WebServiceException: The SSL connection could not be established, see inner exception.
---> System.Net.Http.HttpRequestException: The SSL connection could not be established,
see inner exception.
---> System.Security.Authentication.AuthenticationException: Authentication failed,
see inner exception.
---> Interop+OpenSsl+SslException: SSL Handshake failed with OpenSSL error - SSL_ERROR_SSL.
---> Interop+Crypto+OpenSslCryptographicException:
error:0A000152:SSL routines::unsafe legacy renegotiation disabled
--- End of inner exception stack trace ---
at Interop.OpenSsl.DoSslHandshake(SafeSslHandle context,
ReadOnlySpan`1 input, Byte[]& sendBuf, Int32& sendCount)
经过全面的调查,我们发现问题是由某些第三方使用旧的 SSL 协议和配置引起的。 为了解决这个问题,我们必须更新 OpenSSL 配置为
- 将支持的最低 TLS 版本更改为与您的第三方要求匹配。
- 允许不安全的旧连接和重新协商。
要应用上述更改,需要更新 OpenSSL 配置文件 *openssl.cnf*,该文件位于 * /etc/ssl/ *。 请按照以下步骤操作
找到并打开 * /etc/ssl/openssl.cnf*
cd /etc/ssl
cat openssl.cnf
滚动文件以找到相关部分或配置,如前述说明中提到的最低支持的 TLS 版本以及与不安全的旧连接和重新协商相关的设置。
屏幕上可能会出现一个很长的文件,滚动文件以找到我们的目标部分,system_default_sect
部分。
[ssl_sect]
system_default = system_default_sect
[system_default_sect]
CipherString = DEFAULT:@SECLEVEL=2
有关此文件配置的完整说明,请参见此处:/docs/man1.1.1/man3/SSL_CONF_cmd.html (openssl.org)
现在开始操作,我们需要将两个配置添加到 system_default_sect
部分
MinProtocol = TLSv1
Options = UnsafeLegacyRenegotiation,UnsafeLegacyServerConnect
可以使用 sed
流编辑器命令轻松实现。 以下行将在 CipherString
行后插入我们的配置
sed -i 's/CipherString = DEFAULT:@SECLEVEL=2/CipherString = DEFAULT:@SECLEVEL=1\n\
MinProtocol = TLSv1\n\
Options = UnsafeLegacyRenegotiation,UnsafeLegacyServerConnect\n\
/' /etc/ssl/openssl.cnf
现在再次浏览 *openssl.cnf* 文件,您可以看到
[system_default_sect]
CipherString = DEFAULT:@SECLEVEL=1
MinProtocol = TLSv1
Options = UnsafeLegacyRenegotiation,UnsafeLegacyServerConnect
无需重启容器或采取任何其他操作。 您的配置将自动应用于下一个 SSL 请求。 享受吧!
历史
- 2024 年 3 月 22 日:初始版本