使用pdo_sqlsrv连接SQL Server时SSL证书验证失败求助
解决SQL Server连接SSL证书验证失败问题
临时测试方案
在PDO连接字符串中添加TrustServerCertificate=Yes,跳过证书验证:
<?php $sSGBD = "sqlsrv"; $sDatabase = "db_Des"; $sServer = "10...24"; $sUser = "aplic_..."; $sPwd = "...."; try { if(!$oPDO) { // 新增TrustServerCertificate参数跳过证书校验 $oPDO = new PDO ("$sSGBD:Server=$sServer;Database=$sDatabase;TrustServerCertificate=Yes", "$sUser", "$sPwd"); $oPDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } } catch(PDOException $e) { echo $e->getMessage(); }
⚠️ 此方法仅适合测试环境,生产环境禁用,会降低连接安全性。
生产环境合规方案
1. 导入SQL Server证书到系统信任库
- 从SQL Server服务器获取自签名证书(通常路径:
C:\Program Files\Microsoft SQL Server\MSSQLXX.MSSQLSERVER\MSSQL\DATA下的.cer文件) - 将证书上传至Linux服务器的
/usr/local/share/ca-certificates/目录 - 执行命令更新系统信任库:
sudo update-ca-certificates
2. 调整ODBC驱动加密策略(针对ODBC 18)
ODBC Driver 18默认强制加密连接,可修改为可选加密(仅适用于内部安全网络):
在连接字符串中添加Encryption=Optional:
$oPDO = new PDO ("$sSGBD:Server=$sServer;Database=$sDatabase;Encryption=Optional", "$sUser", "$sPwd");
3. 兼容SQL Server 2008的配置调整
SQL Server 2008仅支持TLS 1.0,而OpenSSL 3.0默认禁用该协议,需手动启用:
- 编辑OpenSSL配置文件
/etc/ssl/openssl.cnf - 在
[system_default_sect]区块添加:
MinProtocol = TLSv1.0 CipherString = DEFAULT@SECLEVEL=1
- 重启PHP-FPM和Web服务器:
sudo systemctl restart php8.2-fpm sudo systemctl restart nginx # 若用Apache则替换为apache2
4. 同配置Debian服务器故障排查
两台同配置Debian 11服务器一正常一报错,检查以下项:
- 确认两台服务器的系统信任库中均已导入SQL Server证书
- 对比OpenSSL配置文件,检查TLS版本限制是否一致
- 用
telnet $sServer 1433或nc -zv $sServer 1433验证服务器到SQL Server的端口连通性 - 查看
/etc/odbcinst.ini文件,确认ODBC驱动版本和配置完全一致
内容的提问来源于stack exchange,提问作者danieldecarvalho
相关产品推荐
相关产品推荐

