PHP:如何解决curl_exec()错误60:无法获取本地发行者证书?

时间:2019-04-08 18:48:56

标签: ssl-certificate php-curl

(此问题的原标题为“为什么curl_exec()在此脚本中失败?”但是通过在脚本中添加对curl_errno()curl_error()的调用,我发现问题出在证书,并且我已经相应地编辑了问题。)

以下脚本:

<?php
$sDataFile = '<path>\journal-issue-ToC.htm';
$sURL = 'https://onlinelibrary.wiley.com/toc/14678624/2014/85/1';
$bHeader = false;

$cURLhandle = curl_init();
$FilePointer = fopen($sDataFile, 'wb');

curl_setopt($cURLhandle, CURLOPT_URL, $sURL);
curl_setopt($cURLhandle, CURLOPT_FILE, $FilePointer);
curl_setopt($cURLhandle, CURLOPT_HEADER, $bHeader);

$bResult = curl_exec($cURLhandle);
echo('<br>' . ($bResult === false ? 'Failed to execute' : 'Executed') . ' cURL.');
if(! $bResult) echo('<br>Error #' . curl_errno($cURLhandle) . ': ' . curl_error($cURLhandle));
curl_close($cURLhandle);

fclose($FilePointer);

保存空文件“ journal-issue-ToC.htm”并生成以下浏览器输出:

Failed to execute cURL.
Error #60: SSL certificate problem: unable to get local issuer certificate

因此,当我在浏览器中访问requested URL时,cURL似乎遇到了证书问题。为了使此脚本正常工作,我需要了解什么有关证书的信息?

我正在Windows 7 64位下的IIS 7.5上运行PHP 7.2.2。

1 个答案:

答案 0 :(得分:0)

为了使cURL正常工作,我需要了解有关证书的知识,该书article on GitHub中介绍了cURL中对证书的需求以及如何获取和应用它们:

  • 我们正在谈论的是https协议所需的SSL证书。 “ CA”代表“证书颁发机构”。
  • https://curl.haxx.se/ca/cacert.pemdocumentation)下载证书。
  • 在文件“ php.ini”的cURL部分中,取消注释CURLOPT_CAINFO选项的命令,并指定下载文件“ cacert.pem”的位置。保存ini文件后,重新启动网络服务器以实现更改。

我做了几个变化:

  • 我选择在函数CURLOPT_CAINFO中而不是在文件“ php.ini”中设置curl_setopt()的值。
  • 我最初遇到错误77,“错误设置证书验证位置”。通过将文件“ cacert.pem”移动到“ Program Files \ PHP”文件夹下的文件夹中,可以解决此问题。

这样做之后,脚本运行无误,并且输出文件也不为空。但是它包含的内容仍然不是我所需要的,它是new question的主题。