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

Windows Server2016下PHP CURL用CURLSSLOPT_NATIVE_CA报SSL证书问题求助

问题:Windows Server 2016下PHP CURL使用CURLSSLOPT_NATIVE_CA无法访问HTTPS网址

在Windows Server 2016环境中,尝试用PHP CURL访问带SSL证书的HTTPS网址,代码设置了如下CURL选项:

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://awebsite.com",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_SSL_OPTIONS => CURLSSLOPT_NATIVE_CA, 
]);

$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);

执行后返回错误:SSL certificate problem: unable to get local issuer certificate

当前环境信息:

  • PHP版本:8.3.12
  • CURL扩展版本:8.7.0
  • php.ini已启用php_openssl.dll,且通过defined()确认CURLSSLOPT_NATIVE_CA已定义

若在php.ini中设置curl.cainfo为Curl项目下载的cacert.pem文件(不设置CURLOPT_SSL_OPTIONS),则可正常访问目标网址。

希望使用CURLSSLOPT_NATIVE_CA选项,但该设置似乎被忽略,或PHP/CURL无法访问Windows Server的系统根证书,请问是否是Windows或PHP环境缺少相关设置?还有其他解决方法吗?


解决方法

1. 确认CURL的SSL后端类型

CURLSSLOPT_NATIVE_CA仅在CURL使用Windows原生SSL(Schannel)后端时生效。如果PHP的CURL编译时采用OpenSSL后端,该选项会被直接忽略。

可通过以下代码检查SSL后端:

var_dump(curl_version()['ssl_version']);
  • 输出含OpenSSL:说明用的是OpenSSL后端,CURLSSLOPT_NATIVE_CA不生效
  • 输出含Schannel:才是Windows原生SSL后端,可继续排查其他问题

2. 检查Windows根证书存储

目标网址的证书签发机构(issuer)必须存在于Windows的受信任根证书存储中:

  1. 运行certmgr.msc打开证书管理器
  2. 展开受信任的根证书颁发机构 -> 证书,确认目标证书的issuer已在列表内
  3. 若缺失,手动导入对应的根证书或中级证书

3. 清理冲突的CURL选项

如果代码或php.ini中设置了CURLOPT_CAINFO/CURLOPT_CAPATH,会覆盖CURLSSLOPT_NATIVE_CA的行为,需确保这些选项未被设置:

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://awebsite.com",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_SSL_OPTIONS => CURLSSLOPT_NATIVE_CA,
  // 显式清空CA相关选项
  CURLOPT_CAINFO => null,
  CURLOPT_CAPATH => null,
]);

$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);

4. 验证PHP运行权限

PHP的运行进程(如IIS应用池账户、CLI执行用户)需要具备读取Windows证书存储的权限:

  • 若为IIS环境,打开IIS管理器,找到对应应用池,查看标识账户
  • 给该账户分配读取C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys目录的权限

5. 更新Windows根证书

Windows Server 2016的默认根证书可能过时,无法验证新的证书 issuer:

  • 运行wuauclt.exe /updatenow触发Windows更新,安装根证书更新补丁
  • 手动下载并安装微软官方发布的根证书更新包

内容的提问来源于stack exchange,提问作者GiuGent

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 01:22:27