我得到了经典的php curl错误“无法获得本地颁发者证书” . 以下是curl调试的更多信息:
尝试133.7.42.21 ... TCP_NODELAY设置已连接到example.adress.com(133.7.42.21)端口443(#0)ALPN,提供http / 1.1密码选择:ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL :!LOW:!RC4:@STRENGTH成功设置证书验证位置:CAfile:C:\ some_absolute_path \ cacert.pem CApath:无SSL证书问题:无法获取本地颁发者证书Curl_http_done:调用premature == 1 \ n *关闭连接0 \ n
你可以看到我试图使用Mozilla.的"cacert.pem"文件我尝试了所有这些,但没有一个工作 .
PHP代码:
$curl = curl_init($location);
//set verifier from interface host
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
//set host global certificate
curl_setopt($curl, CURLOPT_CAINFO, $globla_cert);
//set certificate
curl_setopt($curl, CURLOPT_SSLCERT, $ssl_cert);
//set private key
curl_setopt($curl, CURLOPT_SSLKEY, $ssl_cert_key);
//set private key password
curl_setopt($curl, CURLOPT_SSLKEYPASSWD, $ssl_cert_password);
//set curl debug output
curl_setopt($curl, CURLOPT_VERBOSE, true);
$verbose = fopen('php://temp', 'w+');
curl_setopt($curl, CURLOPT_STDERR, $verbose);
//curl_setopt($curl, CURLINFO_HEADER_OUT, true);
//set ssl version
curl_setopt($curl, CURLOPT_SSLVERSION, 6);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, $request);
curl_setopt($curl, CURLOPT_HEADER, FALSE);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-Type: text/xml"));
curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT_MS, $connecttimeout);
$response = curl_exec($curl);
当我禁用 CURLOPT_SSL_VERIFYPEER
和 CURLOPT_SSL_VERIFYHOST
时,它将在没有全局证书的情况下工作,但这是 NOGO
我目前正在使用PHP版本7.0.15的XAMPP . Apache已启用mod_ssl . PHP启用了openssl和curl扩展 .
我试过的事情:
- 设置php.ini中的路径:
openssl.cainfo= "C:\some_absolute_path\cacert.pem" openssl.cafile= "C:\some_absolute_path\cacert.pem"
-
将证书放在我使用
var_dump(openssl_get_cert_locations());
的默认路径中,这对我来说是"C:\openssl-1.0.2j-win32\ssl" . -
将证书放在“C:\ xampp \ php”中
现在我找不到任何可以尝试的“修复”,有人知道它可能是什么?
1 回答
问题得到解决 .
它不再有效,而且新证书不像旧版本那样Mozilla .