PHP通过cURL访问https时出现SSL certificate problem: unable to get local issuer certificate的解决方法可以分为以下三种。
方法一:将CURLOPT_SSL_VERIFYHOST和CURLOPT_SSL_VERIFYPEER都设置为false或0来禁用这两个配置
方法二:从cURL官方网站下载证书签发机构的根证书并保存到服务器电脑上,然后在PHP生效的配置文件php.ini中添加以下条目,重新启动服务器后生效。
方法三:从cURL官方网站下载证书签发机构的根证书并保存到服务器电脑上,然后在PHP代码中将CURLOPT_CAINFO的值设置为该证书文件的路径,如果没有对服务器程序配置的操作权限,这个方法尤为重要。下载链接和设置CURLOPT_CAINFO的方法可以参考方法一和方法三中相关操作。
需要说明的是,使用方法一将CURLOPT_SSL_VERIFYHOST和CURLOPT_SSL_VERIFYPEER禁用,会导致有被中间人攻击(Man-in-the-Middle Attack,MITM attack)的安全隐患。如果有服务器程序配置的操作权限,建议使用方法二,如果无权修改服务器程序配置,建议选用方法三。
方法二需要在php.ini中添加的配置参数
- [SSL]
- curl.cainfo = "D:\server\wuxiancheng.cn\ssl\cacert.pem"
- openssl.cafile = "${curl.cainfo}"
复制代码 其中curl.cainfo的值需要根据实际情况修改为下载得到的证书文件的真实路径。
方法一代码如下:
<?php
$cURL = curl_init();
$url = 'https://www.51-n.com/';
curl_setopt_array(
$cURL,
array(
CURLOPT_URL => $url,
CURLOPT_REFERER => $url,
CURLOPT_AUTOREFERER => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_CONNECTTIMEOUT => 1,
CURLOPT_TIMEOUT => 30,
CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36'
)
);
//其他代码...
?> |
|