
当使用 ODBC Driver 18 连接 SQL Server 2019 时,若出现“certificate chain was issued by an authority that is not trusted”错误,本质是客户端拒绝验证服务器 SSL 证书链——可通过启用 TrustServerCertificate=true 安全绕过(仅限测试/内网环境)或正确部署受信证书解决。
当使用 odbc driver 18 连接 sql server 2019 时,若出现“certificate chain was issued by an authority that is not trusted”错误,本质是客户端拒绝验证服务器 ssl 证书链——可通过启用 `trustservercertificate=true` 安全绕过(仅限测试/内网环境)或正确部署受信证书解决。
该错误常见于从开发环境(如 IIS Express)迁移到生产级 IIS 服务器后,尤其在未配置证书信任链或使用自签名/内部 CA 签发证书的场景中。ODBC Driver 18 默认强制启用加密(Encrypt=true),且严格校验证书颁发机构(CA)是否被 Windows 本地受信任根证书存储所认可。若 SQL Server 使用的是自签名证书、测试证书,或由企业内部 CA 签发但该 CA 未导入到 IIS 所在服务器的 本地计算机 → 受信任的根证书颁发机构 存储中,就会触发此 SSL 验证失败。
✅ 推荐解决方案(按安全性优先级排序)
方案一:正确部署受信证书(生产环境唯一推荐)
- 在 SQL Server 所在主机上,将用于 SQL Server 加密的证书(如 sqlserver.example.com 的证书)安装至 本地计算机 → 受信任的根证书颁发机构(而非当前用户);
- 确保该证书私钥可被 NT SERVICEMSSQL$InstanceName 或 SQL Server 服务账户访问;
- 在 SQL Server 配置管理器中,确认“SQL Server 网络配置 → 协议 → TCP/IP → 属性 → SSL 证书”已正确指定该证书;
- 重启 SQL Server 服务;
- 此时 PHP 连接无需额外参数,保持默认安全行为:
$serverName = "serverName\instanceName"; // 注意:使用反斜杠,非双斜杠
$connectionInfo = [
"Database" => "Database",
"UID" => "UID",
"PWD" => "PWD",
// Encrypt 和 TrustServerCertificate 均不显式设置 → 启用标准证书链验证
];
$connection = sqlsrv_connect($serverName, $connectionInfo);⚠️ 注意://serverNameinstanceName 是错误写法,应为 serverName\instanceName(转义反斜杠)或 serverNameinstanceName(PHP 字符串中单反斜杠在双引号内有效)。
方案二:临时启用证书信任绕过(仅限开发/测试/封闭内网)
若暂无法部署受信证书,可在连接字符串中显式启用证书信任(必须确保网络环境可信):
$serverName = "serverName\instanceName";
$connectionInfo = [
"Database" => "Database",
"UID" => "UID",
"PWD" => "PWD",
"Encrypt" => true, // 显式启用加密(Driver 18 默认值,但建议保留)
"TrustServerCertificate" => true // 关键:跳过证书链验证(等效于旧版 TrustServerCertificate=yes)
];
$connection = sqlsrv_connect($serverName, $connectionInfo);❌ 错误写法:"TrustServerCertificate" => "Yes" 或 "yes" —— ODBC Driver 18 仅接受布尔值 true/false,传入字符串将被忽略,导致仍执行严格验证并报错。
补充说明:加密模式与端口
- 若 SQL Server 启用了强制加密(Force Encryption = Yes),则所有连接必须满足 Encrypt=true;
- 默认情况下,SQL Server 使用动态端口;如使用命名实例且未配置固定端口,建议在连接字符串中补充 Server=serverName\instanceName;Port=1433; 或启用 SQL Server Browser 服务;
- 可通过 SQL Server 配置管理器 → SQL Server 网络配置 → 协议 → TCP/IP → IP 地址选项卡,为 IPAll 设置 TCP Port=1433 并禁用 TCP Dynamic Ports,实现端口固化。
总结
该错误并非 PHP 或 IIS 配置问题,而是 ODBC Driver 18 对 TLS 安全策略的升级体现。生产环境务必采用方案一,通过 Windows 证书存储建立完整的信任链;开发阶段可谨慎使用 TrustServerCertificate=true 快速验证功能,但绝不可用于公网或敏感数据环境。同时,请始终校验连接字符串格式(特别是实例名分隔符)、服务账户证书权限及 SQL Server 加密配置一致性。


















