You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TLS连接Microsoft SQL Server时如何自定义服务器证书验证

解答

Microsoft.Data.SqlClient 从2.0.0版本开始就提供了和HttpClient的ServerCertificateCustomValidationCallback逻辑完全一致的自定义证书校验能力,配置后天然兼容EF Core、Dapper等所有基于该驱动构建的上层数据访问组件,完全可以实现「仅信任指纹匹配的自签名证书、保持加密、防中间人攻击、无需逐台机器装证书」的需求。

实现步骤

1. 前置确认

  • 确保项目引用的Microsoft.Data.SqlClient版本 ≥ 2.0.0,旧的已停止维护的System.Data.SqlClient没有这个能力,建议直接升级到最新稳定版。
  • 连接字符串保持Encrypt=True(.NET 6+搭配v4以上版本驱动时默认就是开启状态),必须设置TrustServerCertificate=False,如果开了TrustServerCertificate=True,驱动会直接跳过所有校验流程,不会进入自定义回调逻辑。

2. 注册自定义校验逻辑

最推荐用全局注册的方式,程序启动时执行一次配置即可,所有后续创建的SQL连接都会自动走这套校验逻辑,不需要修改EF Core、Dapper的任何现有代码:

using Microsoft.Data.SqlClient;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

// 建议把指纹存在配置文件中,证书轮换时无需重新编译代码
const string TrustedSqlCertThumbprint = "替换为你实际获取到的SQL Server自签名证书指纹,注意去除所有空格、特殊字符";

// 全局注册证书校验回调
SqlConnection.GlobalCustomCertificateValidationCallback = (sender, cert, chain, sslErrors) =>
{
    // 证书本身由受信任CA签发、无任何SSL错误时直接放行
    if (sslErrors == SslPolicyErrors.None)
        return true;

    // 只处理「证书链不受信任」这一种自签名证书带来的错误,其他错误(证书过期、域名不匹配等)直接拦截
    if (sslErrors != SslPolicyErrors.RemoteCertificateChainErrors)
        return false;

    // 校验服务器返回的证书指纹是否和预期值完全匹配
    var serverCert = (X509Certificate2)cert;
    return string.Equals(serverCert.Thumbprint, TrustedSqlCertThumbprint, StringComparison.OrdinalIgnoreCase);
};

如果是ASP.NET Core项目,把这段代码放到Program.cs的最开头、注册DbContext之前执行就行;如果是控制台项目,放到Main方法开头即可。

3. 获取SQL Server证书指纹的方法

两种常用方式选一种即可:

  • 临时把连接字符串的TrustServerCertificate设为True,在校验回调里打个断点,拿到serverCert.Thumbprint的值存好,之后再把TrustServerCertificate改回False。
  • 登录SQL Server所在的服务器,打开本地计算机的证书管理控制台,找到绑定给SQL Server服务的自签名证书,在详情页复制指纹后,去掉所有空格和隐藏的特殊字符即可。

方案优势

  • 全程保持TLS加密,不会像Encrypt=False那样明文传输账号和业务数据
  • 仅信任指纹完全匹配的证书,就算攻击者伪造自签名证书也无法通过校验,规避了TrustServerCertificate=True带来的中间人攻击风险
  • 不需要给每台开发机、生产服务器、容器节点安装自签名证书到受信任根证书存储,运维成本极低
  • 对上层ORM完全透明,EF Core、Dapper等组件不需要做任何适配修改,只要底层用的是符合版本要求的Microsoft.Data.SqlClient就能正常工作

补充:如果不想全局生效,也可以给单个SqlConnection实例单独设置ServerCertificateCustomValidationCallback属性,逻辑和全局回调完全一致,适合多数据源、不同实例用不同证书的场景。

内容的提问来源于stack exchange,提问作者Benj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 07:21:21