为 Windows 上的 PHP CURL 扩展启用证书支持
PHP 开发经常使用 CURL 采集数据。但在 Windows 上抓取 https 会出现以下错误:
SSL certificate problem: unable to get local issuer certificate
这是什么原因造成的呢?我们应该如何解决呢?
从 "php.ini" 说起
在 Windows 上开启 PHP 扩展通常有下面两个步骤:
- 在 php.ini 中搜索 extension_dir = "ext"。 如果行首有“;”的话,将其去掉。接着设置正确的 Php 扩展 DLL 所在的完整路径;
- 在 php.ini 中搜索 extension=curl。 将其行首的“;”去掉,以启用 CURL 扩展。
此时虽然已经成功启用了 PHP CURL 扩展。抓取 http 的网页是没问题的,但 因为没有配置 SSL 证书, 抓取 https 的网页就会得到文出的错误了。
要想配置 Curl 证书需要接着做以下两部:
- 到 这里 下载可以被 CURL 识别的证书文件。
- 在 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);
如果正确输出了本站的网页,那就说明你配置成功了哟!