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。 将其行首的“;”去掉,以启用 CURL 扩展。

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

  要想配置 Curl 证书需要接着做以下两部:

  1.   到 这里 下载可以被 CURL 识别的证书文件。
  2.   在 php.ini 中搜索 “curl.cainfo =”, 去掉行首的“;”,接着在 “=” 后键入完整的证书文件路径以及文件名。

  值得提醒的是,不要在 PHP 代码中设置 CURLOPT_SSL_VERIFYPEER 选项来禁用证书验证。这样会导致被中间人攻击。

来测试一下

  下面一段代码可以检查你的 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

添加新评论