PHP cURL证书错误
我试图将自定义PHP cURL证书错误,php,curl,certificate,Php,Curl,Certificate,我试图将自定义cer-证书添加到我的PHP cURL请求中,但一直出现以下错误: error setting certificate verify locations: CAfile: /path/to/my/cert.cer CApath: none 关于这个错误,我所发现的是: 路径是相对的。 如你所见,我提供了一个绝对路径 路径错误。 我试图var_转储(文件存在($certLocation)),它给了我true,所以情况并非如此 文件的权限不正确。 出于调试目的,我已将权限设置
cer
-证书添加到我的PHP cURL请求中,但一直出现以下错误:
error setting certificate verify locations:
CAfile: /path/to/my/cert.cer
CApath: none
关于这个错误,我所发现的是:
如你所见,我提供了一个绝对路径
我试图
var_转储(文件存在($certLocation))
,它给了我true
,所以情况并非如此出于调试目的,我已将权限设置为
777
。错误依然存在+x
-权限。我也设置了这一点,确保根目录的整个路径具有
+x
-权限,但仍然没有运气验证位置
?我所能理解的是加载文件时出错
任何关于这一点的说明都将不胜感激。请参见下面的代码示例
谢谢
我使用的代码:
<?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");
如果您的PHP安装没有最新的CA根证书捆绑包,请在curl网站下载该捆绑包,并将其保存在您的服务器上: 然后在
php.ini
文件中为其设置一个路径,例如在Windows上:
curl.cainfo=c:\php\cacert.pem
注意:
关闭<代码> CuropoptsSLVVIEFIFIER 允许中间人(MITM)攻击,这是你不想要的!
SRC1-
SRC2-如果您的PHP安装没有最新的CA根证书捆绑包,请在curl网站下载该捆绑包,并将其保存在您的服务器上:
然后在php.ini
文件中为其设置一个路径,例如在Windows上:
curl.cainfo=c:\php\cacert.pem
注意:
关闭<代码> CuropoptsSLVVIEFIFIER 允许中间人(MITM)攻击,这是你不想要的!
SRC1-
SRC2-与
CURLOPT_CAINFO
应设置为PEM格式的CA或CA包。我设法跟踪触发此错误的curl代码,我发现:
在:
显然,对SSL\u CTX\u load\u verify\u locations
的调用返回0
,并结合将CURLOPT\u SSL\u VERIFYPEER
设置为1
的事实,触发错误
SSL\u CTX\u load\u verify\u locations
是openssl库中的一个函数,根据文档(),应考虑以下语句:
如果CAfile不为NULL,它将指向PEM格式的CA证书文件
“在执行SSL_CTX_load_verify_locations()函数时处理CAfile。”
“0-操作失败,因为CAfile和CApath为NULL,或者在指定位置之一的处理失败。”在“返回值”部分下
您可以尝试使用以下命令将cer
转换为pem
:
openssl x509 -in /tmp/cert.cer -inform der -outform pem -out /tmp/cert.pem
但我不能保证这会起作用,因为我不确定您是否有正确的CA或CA捆绑文件。与
CURLOPT_CAINFO
应设置为PEM格式的CA或CA包。我设法跟踪触发此错误的curl代码,我发现:
在:
显然,对SSL\u CTX\u load\u verify\u locations
的调用返回0
,并结合将CURLOPT\u SSL\u VERIFYPEER
设置为1
的事实,触发错误
SSL\u CTX\u load\u verify\u locations
是openssl库中的一个函数,根据文档(),应考虑以下语句:
如果CAfile不为NULL,它将指向PEM格式的CA证书文件
“在执行SSL_CTX_load_verify_locations()函数时处理CAfile。”
“0-操作失败,因为CAfile和CApath为NULL,或者在指定位置之一的处理失败。”在“返回值”部分下
您可以尝试使用以下命令将cer
转换为pem
:
openssl x509 -in /tmp/cert.cer -inform der -outform pem -out /tmp/cert.pem
但我不能保证这会起作用,因为我不确定您是否有正确的CA或CA捆绑文件。您的*.cer文件是否有正确的用户和组集?与您的脚本相同,正在访问它?检查php.ini
上的curl.cainfo
值,如果您能够修改它,请将其更改为curl.cainfo=/tmp/cert.cer
@HelgeTalvikSöderström,这是一个意外的输出。您的/tmp/cert.cer
不是PEM格式的证书吗?文件/tmp/cert.cer
的输出是什么?@HelgeTalvikSöderström哦,我想我知道你有什么样的文件;这个命令现在应该可以正确读取了:opensslx509-in/tmp/cert.cer-notify der-text-noout
,检查它是否是CA证书;我猜您尝试使用的cer
不是CA或CA捆绑包,或者如果是,那么就不是CA签署了您尝试连接的url上使用的证书。@HelgeTalvikSöderström哦,我正忙着写答案,没有注意到您在这里评论:)忽略我在答案中的最后一行,在*.cer文件的所有用户和组设置正确后,您是否拥有正确的CA?与您的脚本相同,正在访问它?检查php.ini
上的curl.cainfo
值,如果您能够修改它,请将其更改为curl.cainfo=/tmp/cert.cer
@HelgeTalvikSöderström,这是一个意外的输出。您的/tmp/cert.cer
不是PEM格式的证书吗?文件/tmp/cert.cer
的输出是什么?@HelgeTalvikSöderström哦,我想我知道你有什么样的文件;这个命令应该读取它