Windows Server2022本地访问PHP页面遇SQL Server SSL证书信任问题求助
问题概述
新部署Windows Server 2022环境,搭配PHP8.2和SQL SRV驱动,PHP页面通过1433端口访问远程SQL Server数据库。外部网络访问PHP页面完全正常,但服务器本地用localhost访问时,抛出以下SSL证书错误:
Array ( [0] => Array ( [0] => 08001 [SQLSTATE] => 08001 [1] => -2146893019 [code] => -2146893019 [2] => [Microsoft][ODBC Driver 18 for SQL Server]SSL Provider: The certificate chain was issued by an authority that is not trusted. [message] => [Microsoft][ODBC Driver 18 for SQL Server]SSL Provider: The certificate chain was issued by an authority that is not trusted. ) [1] => Array ( [0] => 08001 [SQLSTATE] => 08001 [1] => -2146893019 [code] => -2146893019 [2] => [Microsoft][ODBC Driver 18 for SQL Server]Client unable to establish connection [message] => [Microsoft][ODBC Driver 18 for SQL Server]Client unable to establish connection ) )
外部访问正常说明IIS、PHP及驱动配置无问题,核心问题出在服务器本地的证书信任链上。
排查步骤
1. 获取远程SQL Server的证书信息
在远程SQL Server上打开SQL Server配置管理器,依次操作:
- 展开「SQL Server网络配置」
- 选中对应实例的协议(比如
MSSQLSERVER) - 右键点击「TCP/IP」→「属性」→ 切换到「证书」选项卡
记录下证书的颁发机构(CA)和指纹,后续排查要用。
2. 检查服务器本地是否信任目标CA证书
运行certmgr.msc打开证书管理器,注意要以IIS应用池的身份登录(默认是IIS AppPool\DefaultAppPool,自定义了应用池身份则用对应账号):
- 展开「受信任的根证书颁发机构」→「证书」
- 查找是否存在刚才记录的CA证书
- 如果未找到,将远程SQL Server证书的CA证书导入到这个存储区
3. 临时验证证书信任问题(测试用)
修改PHP中的SQL SRV连接字符串,添加TrustServerCertificate=Yes参数:
$serverName = "远程SQL服务器地址,1433"; $connectionInfo = array( "UID" => "数据库用户名", "PWD" => "数据库密码", "Database" => "目标数据库名", "TrustServerCertificate" => "Yes" ); $conn = sqlsrv_connect($serverName, $connectionInfo);
如果添加后本地访问恢复正常,即可确认是证书信任问题,此参数仅作测试用,长期使用建议优先安装CA证书。
4. 确认应用池身份的证书访问权限
即使CA证书已导入,IIS应用池的身份可能缺少证书读取权限:
- 在证书管理器中找到导入的CA证书,右键→「所有任务」→「管理私钥」(根CA无私人密钥可跳过此步)
- 添加IIS应用池账号,授予其「读取」权限
5. 排查内外访问的网络路径差异
外部访问可能经过反向代理或负载均衡,这类设备可能已处理SSL证书信任;而本地访问是服务器上的PHP进程直接发起连接,必须依赖本地机器的证书信任链。
内容的提问来源于stack exchange,提问作者arresteddevelopment

