如何修复Microsoft.Data.SqlClient 4.0.0版本中的「目标主体名称不正确」错误
我刚看到你升级到Microsoft.Data.SqlClient 4.0.0后遇到的这个棘手问题——明明设置了Encrypt=False,还是弹出「已成功与服务器建立连接,但在登录过程中发生错误。(provider: SSL Provider, error: 0 - The target principal name is incorrect)」的SSL错误,回退到2.0.1就恢复正常。结合4.0版本的加密逻辑变更,我整理了几个能帮你在4.0.0版本下解决问题的方法:
1. 搭配TrustServerCertificate=True一起设置
从4.0.0开始,SqlClient的加密校验逻辑更严格了:哪怕你设置了Encrypt=False,如果SQL Server返回了SSL证书,客户端还是会默认验证证书的主体名。这时候得显式加上TrustServerCertificate=True来跳过这个验证,修改后的连接字符串示例如下:
Server=你的服务器地址;Database=目标数据库;User Id=登录账号;Password=登录密码;Encrypt=False;TrustServerCertificate=True;
2. 确认服务器名称与证书主体名完全匹配
如果你的SQL Server确实配置了合法的SSL证书,哪怕Encrypt=False,某些场景下客户端还是会做基础的证书校验。一定要保证连接字符串里写的服务器名称(比如用主机名还是IP)和证书上的主体名完全一致——比如证书上是sql-prod.yourdomain.com,就不能只写sql-prod。
3. 检查系统级的强制加密设置
有些环境里,注册表或者组策略可能开启了「Force Protocol Encryption」(强制协议加密),这个设置会直接覆盖你连接字符串里的Encrypt=False配置。你可以去检查一下对应注册表项:
- 针对32位应用:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSSQLServer\Client\SNI10.0\ForceProtocolEncryption - 针对64位应用:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI10.0\ForceProtocolEncryption
如果该键值为1,改成0后重启应用即可生效。
4. 升级到4.0.0之后的稳定版本
4.0.0作为大版本更新,确实存在一些SSL相关的兼容性小问题,后续发布的4.1.0及以上版本已经修复了不少这类场景。如果上面的方法都没效果,试试升级到最新的稳定版,说不定问题直接就消失了。
补充说明
回退到2.0.1版本能解决问题的原因是:旧版本的加密参数逻辑更宽松,Encrypt=False会直接跳过大部分证书校验环节;而4.0.0版本遵循了更严格的TLS规范,所以需要调整参数来适配你的环境。
内容的提问来源于stack exchange,提问作者Anand

