繁体   English   中英

PHP cURL证书错误

[英]PHP cURL certificate error

我正在尝试向我的PHP cURL请求添加自定义cer -certificate,但是我一直收到此错误:

error setting certificate verify locations:
  CAfile: /path/to/my/cert.cer
  CApath: none

我发现的有关此错误的全部是:

  1. 路径是相对的。
    如您所见,我提供了一条绝对路径。

  2. 路径错误。
    我试图去var_dump(file_exists($certLocation)); ,这使我成为true ,所以情况并非如此。

  3. 该文件的权限不正确。
    我已将权限设置为777 ,以进行调试。 错误仍然存​​在。

  4. 文件路径在链中某处没有+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_CAINFOCURLOPT_SSL_VERIFYPEER结合使用

应将CURLOPT_CAINFO设置为PEM格式的CA或CA捆绑包。 我设法跟踪了触发该错误的curl代码,这就是我发现的结果:

curl / openssl.c中

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM