Windows Server2016下PHP CURL用CURLSSLOPT_NATIVE_CA报SSL证书问题求助
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的受信任根证书存储中:
- 运行
certmgr.msc打开证书管理器 - 展开受信任的根证书颁发机构 -> 证书,确认目标证书的issuer已在列表内
- 若缺失,手动导入对应的根证书或中级证书
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

