跨服务器.NET 4.5应用连接SQL Server 2008 R2失败求助
解决.NET 4.5控制台应用连接SQL Server 2008 R2的SSL算法兼容问题
问题背景
我通过自己完全可控的服务器上部署的.NET 4.5控制台应用,尝试连接一台无修改权限的SQL Server 2008 R2服务器获取数据时,遇到以下错误:
已成功与服务器建立连接,但登录过程中发生错误。(provider: SSL Provider, error: 0 - 客户端和服务器无法通信,因为它们没有共同的算法。)
已尝试以下方法但均无效:
- 调整连接字符串属性:
Encrypt、TrustServerCertificate、Trusted_Connection - 在应用中添加代码:
ServicePointManager.Expect100Continue = true; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3; - 在配置文件中添加:
<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSystemDefaultTlsVersions=false"/>
应用服务器侧可行解决方案
1. 注册表层面启用旧协议支持
SQL Server 2008 R2默认仅支持TLS 1.0和SSL 3.0,.NET 4.5可能因系统默认配置禁用了这些旧协议。可通过修改注册表强制开启:
- 打开注册表编辑器,定位到
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 - 添加DWORD值
SchUseStrongCrypto,设置为0(值为0时允许使用旧加密协议,1则强制仅用强加密) - 若应用运行在64位系统,同步在
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319下添加相同的SchUseStrongCrypto值并设为0
2. 优化连接字符串配置
在连接字符串中明确加密规则,同时跳过服务器证书验证(因无权限修改服务器证书):
Server=你的SQL服务器地址;Database=目标数据库;User ID=账号;Password=密码;Encrypt=True;TrustServerCertificate=True;
确保字符串中没有其他冲突的安全参数。
3. 指定SQL Server旧版客户端驱动
如果应用服务器安装了SQL Server 2008 Native Client,可在连接字符串中指定使用该驱动,更好适配旧服务器:
Server=你的SQL服务器地址;Database=目标数据库;User ID=账号;Password=密码;Encrypt=True;TrustServerCertificate=True;Provider=SQLNCLI10;
若未安装该驱动,需先在应用服务器上部署SQL Server 2008 Native Client安装包。
4. 升级.NET框架到4.6.1及以上(若允许)
.NET 4.6.1及以上版本默认适配系统级TLS协议配置,能自动兼容旧服务器的TLS 1.0。如果应用可以升级框架,直接升级后大概率无需额外配置即可连接。
内容的提问来源于stack exchange,提问作者SAM
相关产品推荐
相关产品推荐

