PHP curl https访问问题,原代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
/* @String url URL地址 * @Array data POST数据
* @Resource curl cURL对象
* @return info 返回信息
*/
$curl = curl_init(); // 启动一个cURL会话
curl_setopt( $curl , CURLOPT_URL, $url ); // 要访问的地址
curl_setopt( $curl , CURLOPT_HEADER, 0); //返回header部分
curl_setopt( $curl , CURLOPT_HTTPHEADER, array ( "Content-Type: application/xml" ));
curl_setopt( $curl , CURLOPT_RETURNTRANSFER, 1); //返回字符串,而非直接输出
curl_setopt( $curl , CURLOPT_USERAGENT, $_SERVER [ 'HTTP_USER_AGENT' ]); // 模拟用户使用的浏览器
curl_setopt( $curl , CURLOPT_POST, 1); // 发送一个常规的Post请求
curl_setopt( $curl , CURLOPT_POSTFIELDS, $data ); // Post提交的数据包
curl_setopt( $curl , CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
$info = curl_exec( $curl ); // 执行操作并返回数据
curl_close( $curl ); // 关闭cURL会话
|
https访问错误,加入了cURL查看错误方法curl_error()
1
2
|
$error = curl_error ( $curl ); //需放在curl_close($curl)执行之前
var_dump( $error );
|
返回的错误信息为:
SSL certificate problem, verify that the CA cert is OK
HTTPS协议服务器进行SSL验证的问题
解决方法有多种,可以将HTTPS改为使用HTTP协议(可行的情况下),也可以通过cURL选项设置为禁止验证(推荐):
1
2
|
curl_setopt( $curl , CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER, FALSE);
|
参看PHP手册中关于cURL选项的描述:PHP: curl_setopt
CURLOPT_SSL_VERIFYPEER
禁用后cURL将终止从服务端进行验证。使用 CURLOPT_CAINFO
选项设置证书使用CURLOPT_CAPATH
选项设置证书目录 如果CURLOPT_SSL_VERIFYPEER
(默认值为2)被启用,CURLOPT_SSL_VERIFYHOST
需要被设置成TRUE
否则设置为FALSE
。
CURLOPT_SSL_VERIFYHOST
1 检查服务器SSL证书中是否存在一个公用名(common name)。译者注:公用名(Common Name)一般来讲就是填写你将要申请SSL证书的域名 (domain)或子域名(sub domain)。2 检查公用名是否存在,并且是否与提供的主机名匹配。
注意按手册规定:
CURLOPT_SSL_VERIFYPEER属于应该被赋予一个bool类型值的选项;
CURLOPT_SSL_VERIFYHOST属于应该被赋予一个integer的选项。
更改之后问题就解决了。
值得一提的是,当cURL出现错误和问题时,curl_exec()将返回FALSE,可以使用上面提到的curl_error()方法输出错误原因。此方法必须在curl_close()之前使用。