.NET 8 AWS Lambda连接SQL Server遇SSL/TLS握手失败错误排查
.NET 8 Lambda连接SQL Server 2012时TLS握手失败问题排查与解决
问题概述
之前用.NET Core 2.1写的AWS Lambda REST API能正常查询远程SQL Server存储过程,换成.NET 8.0的Minimal API后,连接数据库时直接报错:
与服务器建立连接成功,但预登录握手期间出错。(provider: SSL Provider, error: 31 - Encryption(ssl/tls) handshake failed)
内部异常显示:
System.IO.IOException: Received an unexpected EOF or 0 bytes from the transport stream
环境详情
- 数据库服务器:Windows Server 2008 R2 Datacenter(64位)SP1(版本6.1 build 7601)
- SQL Server版本:2012 SP4(版本号
11.0.7507,已从SP3升级) - 数据库暴露方式:仅HTTP URL,无HTTPS选项
当前使用的连接字符串
$"Data Source={serverUrl};Initial Catalog={database};User ID={username};Password={pwd};"
已做过的尝试
- 升级SQL Server 2012到SP4
- 在数据库服务器通过注册表启用TLS 1.2
- 给连接字符串加过
TrustServerCertificate=True、Encrypt=False、MultiSubnetFailover=True参数 - 从
System.Data.SqlClient(4.8.6版)换成Microsoft.Data.SqlClient(5.2.0版)
排查到的关键差异
- TLS握手包对比:旧.NET Core 2.1用TLS 1.2能正常通信;新.NET 8.0同样用TLS 1.2,但Client Hello里多了
psk_key_exchange_modes、key_share这些旧请求没有的扩展字段。 - 密码套件不匹配:旧函数用的
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (0xc028)密码套件,在新函数的Client Hello里根本找不到。
可行解决方法
1. 强制.NET 8使用兼容的TLS配置
在Program.cs的WebApplication构建前,添加代码指定TLS版本和兼容的行为:
using System.Net.Security; using System.Security.Authentication; // 启用强加密并指定TLS 1.2 AppContext.SetSwitch("System.Net.DontEnableSchUseStrongCrypto", false); AppContext.SetSwitch("System.Net.DontEnableSystemDefaultTlsVersions", false); ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; // 配置Microsoft.Data.SqlClient强制用TLS 1.2 AppContext.SetSwitch("Microsoft.Data.SqlClient.EnableSslProtocols", "Tls12");
2. 优化连接字符串参数
明确禁用加密(因为数据库走HTTP),同时指定TLS版本,确保参数生效:
$"Data Source={serverUrl};Initial Catalog={database};User ID={username};Password={pwd};Encrypt=False;TrustServerCertificate=True;SslProtocol=Tls12;"
3. 确认Windows Server 2008 R2的TLS 1.2注册表配置
检查服务器注册表,确保以下键值正确设置为1(不存在就新建):
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client\Enabled= 1HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server\Enabled= 1- 同时把对应的
DisabledByDefault键值设为0
4. 降级Microsoft.Data.SqlClient版本
试试用Microsoft.Data.SqlClient 4.0.0版本,这个版本的TLS握手逻辑更接近旧的System.Data.SqlClient,大概率能兼容SQL Server 2012的旧TLS实现。
内容的提问来源于stack exchange,提问作者Pedro Gaspar
相关产品推荐
相关产品推荐

