[英]PHP cURL certificate error
我正在尝试向我的PHP cURL请求添加自定义cer
-certificate,但是我一直收到此错误:
error setting certificate verify locations:
CAfile: /path/to/my/cert.cer
CApath: none
我发现的有关此错误的全部是:
路径是相对的。
如您所见,我提供了一条绝对路径。
路径错误。
我试图去var_dump(file_exists($certLocation));
,这使我成为true
,所以情况并非如此。
该文件的权限不正确。
我已将权限设置为777
,以进行调试。 错误仍然存在。
文件路径在链中某处没有+x
权限。
我也进行了设置,以确保从root开始的整个路径具有+x
权限,并且仍然没有运气。
我在这里不知所措,尝试了所有可以找到的事实,事实是, 我什至不了解错误的实际含义。 什么是verify location
? 我所能理解的是,加载文件时出错。
对此,我们深表感谢。 请参见下面的代码示例。
谢谢。
我使用的代码:
<?php
$oCurl = curl_init($this->baseUrl);
curl_setopt($oCurl, CURLOPT_FAILONERROR, 1);
curl_setopt($oCurl, CURLOPT_TIMEOUT, $this->timeout);
curl_setopt($oCurl, CURLOPT_CONNECTTIMEOUT, $this->connectionTimeout);
curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($oCurl, CURLOPT_POST, 1);
curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($oCurl, CURLOPT_CAINFO, "/tmp/cert.cer");
错误:
error setting certificate verify locations:
CAfile: /tmp/cert.cer
CApath: none
如果您的PHP安装中没有最新的CA根证书捆绑包,请在curl网站上下载该证书并将其保存在服务器上:
http://curl.haxx.se/docs/caextract.html
然后在您的php.ini
文件中,例如在Windows上,为它设置一个path
:
curl.cainfo=c:\php\cacert.pem
注意:
关闭CURLOPT_SSL_VERIFYPEER
允许中间人(MITM)攻击,这是您不希望的!
SRC1- https: //stackoverflow.com/a/14064903/797495
SRC2- http://php.net/manual/zh/function.curl-setopt.php#110457
CURLOPT_CAINFO与CURLOPT_SSL_VERIFYPEER结合使用
应将CURLOPT_CAINFO
设置为PEM格式的CA或CA捆绑包。 我设法跟踪了触发该错误的curl代码,这就是我发现的结果:
if(!SSL_CTX_load_verify_locations(connssl->ctx,
data->set.str[STRING_SSL_CAFILE],
data->set.str[STRING_SSL_CAPATH])) {
if(data->set.ssl.verifypeer) {
/* Fail if we insist on successfully verifying the server. */
failf(data, "error setting certificate verify locations:\n"
" CAfile: %s\n CApath: %s",
data->set.str[STRING_SSL_CAFILE]?
data->set.str[STRING_SSL_CAFILE]: "none",
data->set.str[STRING_SSL_CAPATH]?
data->set.str[STRING_SSL_CAPATH] : "none");
return CURLE_SSL_CACERT_BADFILE;
}
...
显然,对SSL_CTX_load_verify_locations
的调用返回0
,并与将CURLOPT_SSL_VERIFYPEER
设置为1
的事实相结合,将触发错误。
SSL_CTX_load_verify_locations
是openssl库中的函数,根据文档( SSL_CTX_load_verify_locations文档 ),应考虑以下语句:
“如果CAfile不为NULL,则它指向PEM格式的CA证书文件。”
“ CAfile是在执行SSL_CTX_load_verify_locations()函数时处理的。
“ 0-操作失败,因为CAfile和CApath为NULL或在指定位置之一的处理失败。” 在“ 返回值”部分下
您可以尝试使用以下命令将cer
转换为pem
:
openssl x509 -in /tmp/cert.cer -inform der -outform pem -out /tmp/cert.pem
但我不能保证这会成功,因为我不确定您是否拥有正确的CA或CA Bundle文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.