PHP:如何修复 curl_exec() 错误 60:无法获取本地颁发者证书?

PHP: How to fix curl_exec() error 60: unable to get local issuer certificate?

(这个问题原标题是"Why is curl_exec() failing in this script?" 但是通过在脚本中添加对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

所以看起来cURL遇到了一个证书问题,当我在浏览器中访问requested URL时并没有发生。为了使此脚本正常工作,我需要了解有关证书的哪些信息?

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

为了使 cURL 正常工作,我需要了解的有关证书的信息在 article on GitHub 中,其中解释了 cURL 中对证书的需求以及如何获取和应用它们:

  • 我们所说的是 SSL 证书,它是 https 协议所必需的。 "CA"代表"certificate authorities".
  • https://curl.haxx.se/ca/cacert.pem (documentation 下载证书。
  • 在文件 "php.ini" 的 cURL 部分,取消注释 CURLOPT_CAINFO 选项的命令并指定下载文件“cacert.pem”的位置。保存后ini 文件,重新启动网络服务器以使更改生效。

我做了几个变体:

  • 我选择在函数 curl_setopt() 中而不是在文件 "php.ini" 中设置 CURLOPT_CAINFO 的值。
  • 我一开始遇到错误 77,"error setting certificate verify locations"。已通过将文件 "cacert.pem" 移动到文件夹 "Program Files\PHP".
  • 下的文件夹解决此问题

这样做之后,脚本 运行 没有错误并且输出文件不为空。但是它包含的内容仍然不是我需要的,这是一个.

的主题