DotNetCore Docker容器无法连接指定MSSQL实例问题排查求助
问题根源
你遇到的0x2746错误本质是TLS握手失败导致TCP连接被主动断开,核心是Debian 10(Buster)系统的默认加密策略与目标SQL Server 2016实例的TLS配置不兼容:
- 你使用的
3.1-buster系列镜像基于Debian 10,默认OpenSSL配置禁用了TLS 1.0、TLS 1.1,仅允许TLS 1.2及以上版本,且加密套件列表限制较严格 - 目标SQL Server 2016 SP2-CU2虽然本身支持TLS 1.2,但大概率实例侧未正确启用TLS 1.2,或者配置的加密套件不在Debian 10的允许列表内
可行解决方案
方案1:优先调整SQL Server侧配置(推荐,安全性更高)
- 登录目标SQL Server所在的Windows服务器,打开注册表编辑器,定位到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols - 确认
TLS 1.2节点下的Server子项存在,且Enabled值设为1,DisabledByDefault值设为0 - 安装SQL Server 2016 SP2的最新累积更新,大量TLS相关的兼容性问题会在累积更新中修复
- 重启SQL Server服务生效
方案2:调整容器侧OpenSSL配置(适用于无法修改SQL Server侧配置的场景)
你之前仅注释ssl_conf行不生效,是因为还需要修改允许的TLS版本和加密套件等级,完整的Dockerfile修改如下:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base # 调整OpenSSL配置兼容低版本TLS协议 RUN sed -i 's/MinProtocol = TLSv1.2/MinProtocol = TLSv1/g' /etc/ssl/openssl.cnf \ && sed -i 's/CipherString = DEFAULT@SECLEVEL=2/CipherString = DEFAULT@SECLEVEL=1/g' /etc/ssl/openssl.cnf FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build # 此处保留你原有构建逻辑即可
该配置会降低OpenSSL的安全级别,允许使用TLS 1.0/1.1协议,同时放开加密套件限制,适配未正确启用TLS 1.2的SQL Server实例。
验证步骤
构建新镜像并运行容器后,在容器内重新执行sqlcmd命令测试连通性即可。
内容的提问来源于stack exchange,提问作者user804401
相关产品推荐
相关产品推荐

