升级至.NET 8后OpenSSL 3配置失效,如何默认启用TLSv1?
.NET 8 + OpenSSL 3.0 配置TLSv1默认启用的问题
问题背景
之前在Docker中使用mcr.microsoft.com/dotnet/aspnet:7.0(内置OpenSSL 1.1.1)托管.NET 7应用时,为解决MSSQL连接问题,在/etc/ssl/openssl.cnf中配置了以下内容:
[default_conf] ssl_conf = ssl_sect [ssl_sect] system_default = system_default_sect [system_default_sect] MinProtocol = TLSv1 CipherString = DEFAULT@SECLEVEL=1
升级到mcr.microsoft.com/dotnet/aspnet:8.0(内置OpenSSL 3.0.11)后,该配置失效,出现MSSQL连接握手失败错误,堆栈信息如下:
Unhandled exception. Microsoft.Data.SqlClient.SqlException (0x80131904): A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: SSL Provider, error: 31 - Encryption(ssl/tls) handshake failed) ---> System.IO.IOException: Received an unexpected EOF or 0 bytes from the transport stream. at System.Net.Security.SslStream.ReceiveHandshakeFrameAsync[TIOAdapter](CancellationToken cancellationToken) at System.Net.Security.SslStream.ForceAuthenticationAsync[TIOAdapter](Boolean receiveFirst, Byte[] reAuthenticationData, CancellationToken cancellationToken) at System.Net.Security.SslStream.AuthenticateAsClient(SslClientAuthenticationOptions sslClientAuthenticationOptions) at Microsoft.Data.SqlClient.SNI.SNITCPHandle.EnableSsl(UInt32 options)
需解决:如何在OpenSSL 3中默认启用TLSv1?
解决方案
OpenSSL 3.0对配置结构做了调整,核心是初始化入口节点变更,具体操作如下:
修改OpenSSL配置文件
编辑/etc/ssl/openssl.cnf,替换为以下内容:[openssl_init] ssl_conf = ssl_sect [ssl_sect] system_default = system_default_sect [system_default_sect] MinProtocol = TLSv1 CipherString = DEFAULT@SECLEVEL=1关键变化:将原1.1.1版本的
[default_conf]替换为OpenSSL 3.0的新全局配置入口[openssl_init],这是原配置失效的核心原因。验证配置生效
执行以下命令测试是否能通过TLSv1连接MSSQL服务器:openssl s_client -connect <你的MSSQL服务器地址>:1433 -tls1若能成功建立连接,说明配置已生效。
Docker镜像中持久化配置
若通过Dockerfile构建镜像,建议将配置修改写入镜像,避免每次容器启动重复配置:FROM mcr.microsoft.com/dotnet/aspnet:8.0 COPY openssl.cnf /etc/ssl/openssl.cnf # 其他镜像构建步骤...
补充说明
SECLEVEL=1的设置保持不变,它允许使用较弱加密算法和旧协议,适配旧版MSSQL服务器需求。
内容的提问来源于stack exchange,提问作者Ilia
相关产品推荐
相关产品推荐

