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哦,我想我知道你有什么样的文件;这个命令应该读取它