PHP 开发经常使用 CURL 抓取网站数据。但在 Windows 上抓取 https 会出现以下错误:

SSL certificate problem: unable to get local issuer certificate

  这是什么原因造成的呢?我们应该如何解决呢?

从 "php.ini" 说起

  在 Windows 上开启 PHP 扩展通常有下面两个步骤:

  1.   在 “php.ini” 中搜索 “;extension_dir = "ext"”, 去掉“;”(分号)并且设置正确的 Php 扩展 DLL 所在完整的路径;
  2.   在 “php.ini” 中搜索 “;extension=curl” 去掉“;”(分号)或者手动键入 “extension=<ext_name>” 来启用 <ext_name> 为名的扩展,通常前者适用于 PHP 自带的扩展,后者适用于自己下载的扩展。

  此时虽然已经成功启用了 PHP CURL 扩展。抓取 http 的网页是没问题的,但 因为没有配置 SSL 证书, 抓取 https 的网页就会得到文出的错误了。

  要想配置 Curl 证书可以到 这里 下载可以被 CURL 识别的证书文件。接着在 “php.ini” 中搜索 “;curl.cainfo =”, 去掉“;”(分号),接着后面设置完整的 SSL 证书文件路径。

  值得提醒的是,不要使用 “CURLOPT_SSL_VERIFYPEER” 来禁用 CURL 证书验证,尤其是在正式生产环境中。因为那会造成被中间人攻击的风险。

来测试一下

  下面一段代码可以检查你的 Curl 扩展运行情况。

<?php
/* 使用 CURL 获取网页数据 */

$url = 'https://www.bitglow.cn/';

/* 初始化 CURL 句柄 */
$ch = curl_init();

/* 设置 CURL 请求选项 */
curl_setopt($ch, CURLOPT_URL , $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

/* 禁用 SSL 证书验证
 * 强烈不推荐你这样做,会有中间人攻击的风险
 */
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

/* 执行 Curl */
$content = curl_exec($ch);

/* 先判断是否成功,然后输出内容或错误信息 */
if($content !== FALSE) {
    echo $content;
}
else {
    echo curl_error($ch);
}

/* 关闭 CURL 句柄 */
curl_close($ch);

  如果正确输出了本站的网页,那就说明你配置成功了哟!

参考链接

  PHP: 在 Windows 上安装 PHP 扩展 - Manual

  PHP: curl_setopt - Manual

标签: PHP

添加新评论