65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2024 年 3 月 22 日

CPOL

2分钟阅读

viewsIcon

3395

配置 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 配置为

  1. 将支持的最低 TLS 版本更改为与您的第三方要求匹配。
  2. 允许不安全的旧连接和重新协商。

要应用上述更改,需要更新 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 日:初始版本
© . All rights reserved.