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".
下的文件夹解决此问题
这样做之后,脚本 运行 没有错误并且输出文件不为空。但是它包含的内容仍然不是我需要的,这是一个.
的主题
(这个问题原标题是"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". 下的文件夹解决此问题
这样做之后,脚本 运行 没有错误并且输出文件不为空。但是它包含的内容仍然不是我需要的,这是一个