
本文详解如何解决 php 使用 odbc driver 18 连接 sql server 2019 时出现的「certificate chain was issued by an authority that is not trusted」ssl 证书信任错误,核心是正确配置加密与证书验证参数。
本文详解如何解决 php 使用 odbc driver 18 连接 sql server 2019 时出现的「certificate chain was issued by an authority that is not trusted」ssl 证书信任错误,核心是正确配置加密与证书验证参数。
当在 Windows Server 上将 PHP 应用从 IIS Express 迁移至 IIS,并使用 Microsoft ODBC Driver 18 for SQL Server 连接 SQL Server 2019 时,常会遇到如下典型错误:
[Microsoft][ODBC Driver 18 for SQL Server]SSL Provider: The certificate chain was issued by an authority that is not trusted.
该错误并非表示证书本身无效,而是 客户端(ODBC 驱动)默认启用加密(Encrypt=true)且严格验证服务器证书链,而你的 SQL Server 使用的是自签名证书、内网 CA 签发证书,或证书根证书未被 Windows 本地计算机信任存储(Trusted Root Certification Authorities)所信任。
✅ 正确解决方案:显式配置连接参数
需在 sqlsrv_connect() 的 $connectionInfo 数组中明确指定以下两个关键参数:
- Encrypt => true:启用 TLS 加密传输(推荐生产环境仍启用,保障数据安全)
- TrustServerCertificate => true:跳过证书链验证,仅验证证书是否由服务器提供(即接受自签名或非公共 CA 签发的证书)
⚠️ 注意:TrustServerCertificate=Yes 或 TrustServerCertificate=1 无效 —— ODBC Driver 18 严格要求布尔值 true(PHP 布尔型),字符串或数字均不被识别,可能导致静默失败或回退到默认严格模式。
修正后的 PHP 连接代码如下:
<?php
$serverName = "serverName\instanceName"; // 注意:使用反斜杠,非双斜杠;若为默认实例可省略 "\instanceName"
$connectionInfo = [
"Database" => "YourDatabase",
"UID" => "YourUsername",
"PWD" => "YourPassword",
"Encrypt" => true,
"TrustServerCertificate" => true, // ⚠️ 必须为 PHP 布尔值 true
"TrustServerCertificate" => true // (重复强调:不可写 'yes'、'1' 或 'true' 字符串)
];
$connection = sqlsrv_connect($serverName, $connectionInfo);
if (!$connection) {
echo "<pre>";
print_r(sqlsrv_errors());
echo "</pre>";
die("Connection failed.");
}
echo "Connected successfully with encrypted channel.";
?>? 补充说明与最佳实践
- 服务器名格式://serverNameinstanceName 是错误写法,应为 serverName\instanceName(单反斜杠在 PHP 字符串中需转义为双反斜杠)或使用原始字符串 r'serverNameinstanceName'。
-
生产环境建议:
- 若使用由公共 CA(如 DigiCert、Let’s Encrypt)签发的有效证书,请移除 TrustServerCertificate=>true,仅保留 Encrypt=>true,以确保完整证书链校验。
- 同时确保 SQL Server 配置了正确的证书(通过 SQL Server Configuration Manager → SQL Server Network Configuration → Protocols for [Instance] → 右键属性 → Certificate 选项卡设置)。
-
证书部署检查:
在 Windows Server 上,打开 certlm.msc(本地计算机证书管理器),确认服务器证书已导入「个人」存储,且其根 CA 证书存在于「受信任的根证书颁发机构」存储中。否则即使配置正确,仍可能报错。
✅ 总结
| 问题根源 | ODBC Driver 18 默认强制加密 + 严格证书链验证 |
|---|---|
| 关键修复 | Encrypt => true + TrustServerCertificate => true(布尔值!) |
| 常见误区 | 使用字符串 'Yes'、'true' 或整数 1 替代布尔 true |
| 安全权衡 | 开发/测试环境可启用 TrustServerCertificate;生产环境应部署受信证书并关闭该选项 |
通过精准配置连接参数,即可在保障通信加密的前提下,绕过非公信 CA 的证书信任限制,快速恢复 PHP 与 SQL Server 的稳定连接。


















