Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
修复SSL证书问题:无法在PHP中获取real的本地颁发者证书_Php_Ssl_Curl_Ssl Certificate_Ca - Fatal编程技术网

修复SSL证书问题:无法在PHP中获取real的本地颁发者证书

修复SSL证书问题:无法在PHP中获取real的本地颁发者证书,php,ssl,curl,ssl-certificate,ca,Php,Ssl,Curl,Ssl Certificate,Ca,在我的PHP代码中,我在某个时候执行了一个指向外部网站的cURL。今天,我突然犯了一个错误: SSL证书问题:无法获取本地颁发者证书 这是我的代码的相关部分: //downloaded from https://curl.haxx.se/docs/caextract.html //(latest version Wed Oct 14 03:12:15 2020 GMT) $cacert_pem = realpath("some/path/to/cacert.pem")

在我的PHP代码中,我在某个时候执行了一个指向外部网站的cURL。今天,我突然犯了一个错误:

SSL证书问题:无法获取本地颁发者证书

这是我的代码的相关部分:

//downloaded from https://curl.haxx.se/docs/caextract.html
//(latest version Wed Oct 14 03:12:15 2020 GMT)    
$cacert_pem = realpath("some/path/to/cacert.pem"); 

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($query_data));
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_CAINFO, $cacert_pem);
在网上搜索这个问题时,我在这个网站上遇到了很多问题,但没有一个能真正解释到底发生了什么,他们只是告诉我编辑php.ini并指向cacert文件,或者将文件更新为新版本,或者做类似的事情:

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
这显然是不推荐的

然后我来到这里,其中一个解决方案是:

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, $cacert_pem);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $cacert_pem);
错误消失了

因此,我的问题是:

  • 首先,为什么会发生这种情况?我的意思是,为什么代码昨天起作用,但今天不起作用。如果我理解正确,问题出在我这边,而不是外部网站
  • 所描述的解决方案是否真的解决了问题,或者与将值设置为
    0
    相同?根据文档,CURLOPT_SSL_VERIFYHOST的可能值为0、1或2
  • 当然……我怎么才能解决这个问题
  • 首先,为什么会发生这种情况?我的意思是,为什么代码昨天起作用,但今天不起作用。如果我理解正确,问题出在我这边,而不是外部网站

    如果没有对代码进行任何更改,并且代码突然停止工作,那么问题可能出在远程站点上。一个典型的问题是站点的证书得到了更新,证书设置不正确(如缺少中间证书),或者证书现在由不同的CA颁发

    由于您的CA信任存储看起来只是Firefox使用的常用存储,我认为问题在于服务器端的配置错误。由于我们不知道您试图访问的网站,您必须亲自检查。为此,您可以使用分析网站,然后查找任何问题,特别是“连锁问题”

    所描述的解决方案是否真的解决了问题,还是与将值设置为0相同

    根据我的理解,这个“解决方案”是危险的错误。正如您正确认识到的,这些选项不接受字符串作为参数,而只接受数字。给出一个字符串将隐式地将该字符串转换为一个数字,除非该字符串以数字开头,否则该数字将为0。因此,在大多数情况下,您提到的帖子中显示的“修复”实际上会禁用证书验证。难怪错误会消失,但这当然是相当危险的

    当然……我怎么才能解决这个问题


    取决于错误的实际原因。如果服务器缺少中间证书,您可以尝试将这些缺少的证书添加到您的信任存储中,即添加到您已经存在的证书之外。

    我执行了测试,并收到“此服务器的证书链不完整。等级上限为B”警告。我试图访问的站点是