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 编写的日历
Oct 09 PHP
通过ICQ网关发送手机短信的PHP源程序
Oct 09 PHP
php创建基本身份认证站点的方法详解
Jun 08 PHP
如何用php获取程序执行的时间
Jun 09 PHP
hadoop中一些常用的命令介绍
Jun 19 PHP
PHP 伪静态技术原理以及突破原理实现介绍
Jul 12 PHP
PHP判断远程图片或文件是否存在的实现代码
Feb 20 PHP
改写ThinkPHP的U方法使其路由下分页正常
Jul 02 PHP
PHP+Memcache实现wordpress访问总数统计(非插件)
Jul 04 PHP
PHP中的socket_read和socket_recv区别详解
Feb 09 PHP
php抽象类使用要点与注意事项分析
Feb 09 PHP
php实现生成验证码实例分享
Apr 10 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
一个程序下载的管理程序(三)
2006/10/09 PHP
php文件上传表单摘自drupal的代码
2011/02/15 PHP
php定时删除文件夹下文件(清理缓存文件)
2013/01/23 PHP
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
读jQuery之八 包装事件对象
2011/06/21 Javascript
Jquery 表单验证类介绍与实例
2013/06/09 Javascript
Google Maps API地图应用示例分享
2014/10/23 Javascript
JavaScript中的parse()方法使用简介
2015/06/12 Javascript
使用vue.js制作分页组件
2016/06/27 Javascript
基于WebUploader的文件上传js插件
2016/08/19 Javascript
使用Angular缓存父页面数据的方法
2017/01/03 Javascript
浅谈vue-router 路由传参的方法
2017/12/27 Javascript
react-native 圆弧拖动进度条实现的示例代码
2018/04/12 Javascript
jQuery实现的简单手风琴效果示例
2018/08/29 jQuery
vue主动刷新页面及列表数据删除后的刷新实例
2018/09/16 Javascript
JavaScript基于遍历操作实现对象深拷贝功能示例
2019/03/05 Javascript
vue滚动固定顶部及修改样式的实例代码
2019/05/30 Javascript
在微信小程序中使用vant的方法
2019/06/07 Javascript
element-ui tooltip修改背景颜色和箭头颜色的实现
2019/12/16 Javascript
通过实例解析chrome如何在mac环境中安装vue-devtools插件
2020/07/10 Javascript
[01:42]TI4西雅图DOTA2前线报道 第一顿早饭哦
2014/07/08 DOTA
详解Python中映射类型(字典)操作符的概念和使用
2015/08/19 Python
python中hashlib模块用法示例
2017/10/30 Python
python梯度下降法的简单示例
2018/08/31 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
2019/08/28 Python
基于python爬取有道翻译过程图解
2020/03/31 Python
windows上彻底删除jupyter notebook的实现
2020/04/13 Python
香港永安旅游网:Wing On Travel
2017/04/10 全球购物
伦敦剧院门票:From The Box Office
2018/06/30 全球购物
群众路线教育实践活动方案
2014/02/02 职场文书
中学优秀班主任事迹材料
2014/05/01 职场文书
2014年店长工作总结
2014/11/17 职场文书
求职信内容一般写什么?
2015/03/20 职场文书
Maven学习----Maven安装与环境变量配置教程
2021/06/29 Java/Android
vue动态绑定style样式
2022/04/20 Vue.js
MySQL串行化隔离级别(间隙锁实现)
2022/06/16 MySQL