SQL Server 2022连接报错:SSL Provider参数无效问题排查求助
问题概述
部署新的Windows Server 2022 + SQL Server 2022 Standard数据库实例后,Windows Server 2008R2上的网站连接该实例时抛出错误:
SqlException (0x80131904): 已成功与服务器建立连接,但在登录过程中发生错误。(provider: SSL Provider, error: 0 - 传递给函数的一个或多个参数无效。)
原连接字符串指向Windows Server 2008R2上的旧数据库可正常工作,连接字符串(脱敏后):
<connectionStrings> <add name="ConnectionStringName" connectionString="Data Source=ServerName;Initial Catalog=DatabaseName;User ID=website;Password=********;Max Pool Size=32767" providerName="System.Data.SqlClient" /> </connectionStrings>
已尝试在连接字符串中添加Encrypt=False和/或TrustServerCertificate=True的所有组合,均无法解决问题。
更新:在Windows Server 2008R2上使用SSMS 2008R2连接SQL Server 2022时,出现类似错误:
无法连接到XX.XX.XX.XXX。已成功与服务器建立连接,但在预登录握手过程中发生错误。(provider: SSL Provider, error: 0 - 传递给函数的一个或多个参数无效。) (Microsoft SQL Server)
核心原因分析
这个错误本质是Windows Server 2008R2的TLS/SSL组件版本过旧,不支持SQL Server 2022要求的密码套件或TLS协议细节——即使双方都启用了TLS1.2/1.3,2008R2的加密组件无法与2022服务器完成正常握手。
具体排查修复步骤
1. 升级Windows Server 2008R2的TLS相关补丁
Windows Server 2008R2默认的TLS1.2支持存在局限性,需确保服务器已安装SP1,再安装以下关键补丁:
- KB3140245:启用TLS1.2作为默认协议的更新
- KB3154518:修复TLS1.2与SQL Server通信的兼容性问题
- KB4019276:更新加密组件,支持更多现代密码套件
2. 配置Windows Server 2008R2的注册表启用兼容密码套件
打开注册表编辑器(regedit),定位到路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers
启用SQL Server 2022支持、且2008R2兼容的密码套件,禁用过时的3DES、RC4等套件:
- 在
Ciphers下新建项AES 256/128 - 在该项下新建DWORD值
Enabled,设置为1 - 重启服务器生效
3. 更新SQL Server客户端组件
Windows Server 2008R2上的System.Data.SqlClient版本过旧,无法适配SQL Server 2022的加密要求:
- 安装最新的SQL Server Native Client 11.0或更高版本
- 若网站基于.NET Framework,升级到4.7.2或更高版本,新版本
SqlClient对TLS1.2支持更完善
4. 调整SQL Server 2022的加密设置
在SQL Server 2022服务器上降低加密要求以兼容旧客户端:
- 打开SQL Server配置管理器,找到对应实例的「SQL Server网络配置」
- 右键目标实例协议,选择「属性」,在「标志」选项卡中,将「强制加密」设置为「否」
- 重启SQL Server服务后尝试连接
5. 验证TLS握手兼容性
在2008R2服务器上安装OpenSSL,执行命令:
openssl s_client -connect <DB服务器IP>:1433
查看握手过程中的错误信息,确认是否存在密码套件不匹配的情况。
内容的提问来源于stack exchange,提问作者cjo30080

