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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:33:21