php使用curl访问https示例分享


Posted in PHP onJanuary 17, 2014

为方便说明,先上代码吧

/** 
 * curl POST 
 * 
 * @param   string  url 
 * @param   array   数据 
 * @param   int     请求超时时间 
 * @param   bool    HTTPS时是否进行严格认证 
 * @return  string 
 */  
function curlPost($url, $data = array(), $timeout = 30, $CA = true){        $cacert = getcwd() . '/cacert.pem'; //CA根证书  
    $SSL = substr($url, 0, 8) == "https://" ? true : false;  
    $ch = curl_init();  
    curl_setopt($ch, CURLOPT_URL, $url);  
    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);  
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout-2);  
    if ($SSL && $CA) {  
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);   // 只信任CA颁布的证书  
        curl_setopt($ch, CURLOPT_CAINFO, $cacert); // CA根证书(用来验证的网站证书是否是CA颁布)  
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // 检查证书中是否设置域名,并且是否与提供的主机名匹配  
    } else if ($SSL && !$CA) {  
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何证书  
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); // 检查证书中是否设置域名  
    }  
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); //避免data数据过长问题  
    curl_setopt($ch, CURLOPT_POST, true);  
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);  
    //curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); //data with URLEncode  
    $ret = curl_exec($ch);  
    //var_dump(curl_error($ch));  //查看报错信息  
    curl_close($ch);  
    return $ret;    
}   

如果URL地址是https打头,那就走SSL,否则就走普通的HTTP协议。

是否走HTTPS的话就安全了吗?其实SSL也有不同的验证程度。

例如需不需要验证证书中的公用名呢?(BTW:公用名(Common Name)一般来讲就是填写你将要申请SSL证书的域名 (domain)或子域名(sub domain)。)

需要验证主机名吗?

是任何证书都信任呢还是只信任CA颁布的呢?

(我擦嘞,电池快没点了,只捡关键地儿说了 - -|||)

如果网站SSL证书买的是CA的(通常比较贵),那么访问时可以使用比较严格的认证,即:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);   // 只信任CA颁布的证书 
curl_setopt($ch, CURLOPT_CAINFO, $cacert); // CA根证书(用来验证的网站证书是否是CA颁布) 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // 检查证书中是否设置域名,并且是否与提供的主机名匹配

如果网站的证书是自己生成的,或者是网上的小机构申请的,那么访问时如果使用严格认证则不会通过,直接返回false。(对了,返回false时可以打印curl_error($ch)查看具体错误信息。)此时可以根据情况通过降低验证程度来保证正常访问,例如:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何证书 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); // 检查证书中是否设置域名(为0也可以,就是连域名存在与否都不验证了)

平时我们使用浏览器访问各个https网站时,有时会遇到证书不受信的提示,其实就是因为这些网站的证书不是正规CA机构颁布的。

市面上各种浏览器中都内置了CA根证书列表信息,访问有CA颁布证书的网站时,会根据根证书验证这些网站的证书,所以就不会有这个提示了。

关于CA根证书文件,其实就是包含了各个主要CA机构的公钥证书,用来验证网站的证书是否是这些机构颁发的。

这里的这个文件是来源于mozilla的源码树,又转换成PEM格式证书文件。(大家可以到这里下载现成的http://curl.haxx.se/ca/cacert.pem)

最后说一个和SSL无关的东西:

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));

这个主要是为了解决POST时数据过长问题

PHP 相关文章推荐
php file_exists 检查文件或目录是否存在的函数
May 10 PHP
PHP+ACCESS 文章管理程序代码
Jun 21 PHP
PHP 验证码的实现代码
Jul 17 PHP
浅析get与post的一些特殊情况
Jul 28 PHP
php中magic_quotes_gpc对unserialize的影响分析
Dec 16 PHP
php查询mssql出现乱码的解决方法
Dec 29 PHP
PHP实现动态web服务器方法
Jul 29 PHP
PHP实现微信网页授权开发教程
Jan 19 PHP
PHP生成word文档的三种实现方式
Nov 14 PHP
Zend Framework入门教程之Zend_Config组件用法详解
Dec 09 PHP
Ajax+PHP实现的模拟进度条功能示例
Feb 11 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
Jun 02 PHP
php将url地址转化为完整的a标签链接代码(php为url地址添加a标签)
Jan 17 #PHP
php 检查电子邮件函数(自写)
Jan 16 #PHP
php mail to 配置详解
Jan 16 #PHP
php生成txt文件标题及内容的方法
Jan 16 #PHP
PHP获取php,mysql,apche的版本信息示例代码
Jan 16 #PHP
php获取淘宝分类id示例
Jan 16 #PHP
php生成数组的使用示例 php全组合算法
Jan 16 #PHP
You might like
基于php-fpm的配置详解
2013/06/03 PHP
如何使用微信公众平台开发模式实现多客服
2016/01/06 PHP
PHP应用跨时区功能的实现方法
2019/03/21 PHP
JS event使用方法详解
2008/04/28 Javascript
JQUERY设置IFRAME的SRC值的代码
2010/11/30 Javascript
让innerText在firefox火狐和IE浏览器都能用的写法
2011/05/14 Javascript
JS和函数式语言的三特性
2014/03/05 Javascript
如何判断微信内置浏览器(通过User Agent实现)
2014/09/01 Javascript
IE下通过a实现location.href 获取referer的值
2014/09/04 Javascript
node.js中的buffer.Buffer.isEncoding方法使用说明
2014/12/14 Javascript
JavaScript预解析及相关技巧分析
2016/04/21 Javascript
详解JavaScript设计模式开发中的桥接模式使用
2016/05/18 Javascript
Node.js Addons翻译(C/C++扩展)
2016/06/12 Javascript
jquery表单插件form使用方法详解
2017/01/20 Javascript
Vue.js实现价格计算器功能
2020/03/30 Javascript
基于Vue的SPA动态修改页面title的方法(推荐)
2018/01/02 Javascript
angularJS的radio实现单项二选一的使用方法
2018/02/28 Javascript
vue.js移动数组位置,同时更新视图的方法
2018/03/08 Javascript
vue 弹框产生的滚动穿透问题的解决
2018/09/21 Javascript
iview在vue-cli3如何按需加载的方法
2018/10/31 Javascript
[54:08]LGD女子刀塔学院 DOTA2炼金术士教学
2014/01/09 DOTA
用Python实现通过哈希算法检测图片重复的教程
2015/04/02 Python
python保存字符串到文件的方法
2015/07/01 Python
对Python信号处理模块signal详解
2019/01/09 Python
使用matplotlib中scatter方法画散点图
2019/03/19 Python
通过cmd进入python的实例操作
2019/06/26 Python
python 采用paramiko 远程执行命令及报错解决
2019/10/21 Python
python绘制封闭多边形教程
2020/02/18 Python
Python各种扩展名区别点整理
2020/02/27 Python
Python捕获异常堆栈信息的几种方法(小结)
2020/05/18 Python
实现strstr功能,即在父串中寻找子串首次出现的位置
2016/08/05 面试题
汽修专业学生自我鉴定
2013/11/16 职场文书
家庭财产分割协议范文
2014/11/24 职场文书
高中诗歌鉴赏教学反思
2016/02/16 职场文书
Python卷积神经网络图片分类框架详解分析
2021/11/07 Python
2022年显卡天梯图(6月更新)
2022/06/17 数码科技