PHP忽略了php.ini中的curl.cainfo设置(显然)

时间:2014-04-30 15:27:24

标签: php iis curl ssl

我正在尝试在Windows服务器(运行IIS)上修复php_curl调用,该服务器返回熟悉的错误“SSL证书问题,验证CA证书是否正常。详细信息: 错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败“。

如此处的许多相关问题所述,我下载了http://curl.haxx.se/ca/cacert.pem,将其移至我服务器的硬盘,并将curl.cainfo设置添加到我的php.ini中:

curl.cainfo = "C:\path\to\cacert.pem"

没什么,仍然得到同样的错误。但是,在PHP代码中指定路径会导致响应成功!

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CAINFO, "C:\path\to\cacert.pem");
$response = curl_exec($ch);

这确实给了我一个我现在可以使用的解决方法,但是我在很多地方使用php_curl调用维护一个大型应用程序,所以在php.ini中指定一次这个设置会更合乎逻辑,所以它适用于所有php_curl在应用程序中调用。

潜在的愚蠢错误检查:

  1. 我在php.ini编辑之间重新启动IIS
  2. 我知道我正在编辑正确的php.ini,因为“echo ini_get('smtp_port');”反映我对该设置所做的更改(更改非关键设置仅用于测试)
  3. 我知道IIS可以读取文件,因为它在使用curl_setopt()(上面)设置时可以正常工作
  4. 尝试直接查看ini设置会显示PHP似乎对此一无所知(我这样做了吗?):

    var_dump(ini_get('curl.cainfo'));
    
    ==> bool(false)
    

    为什么PHP不会读取curl.cainfo设置的任何想法?

1 个答案:

答案 0 :(得分:14)

圣洁的通心粉,一位同事刚刚为我解开了这个谜团。将它留在这里,以防它帮助其他人。

这个curl php.ini设置直到PHP 5.3.7才被添加:http://www.php.net/manual/en/curl.configuration.php#ini.curl.cainfo

我正在使用的特定测试服务器运行的是旧版本,因此PHP没有从php.ini读取该设置。就这么简单。