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 相关文章推荐
pw的一个放后门的方法分析
Oct 08 PHP
php 数据库字段复用的基本原理与示例
Jul 22 PHP
ThinkPHP查询语句与关联查询用法实例
Nov 01 PHP
php获取字符串中各个字符出现次数的方法
Feb 23 PHP
php源码分析之DZX1.5字符串截断函数cutstr用法
Jun 17 PHP
使用php-timeit估计php函数的执行时间
Sep 06 PHP
使用WordPress发送电子邮件的相关PHP函数用法解析
Dec 15 PHP
Yii+upload实现AJAX上传图片的方法
Jul 13 PHP
Centos 6.5系统下编译安装PHP 7.0.13的方法
Dec 19 PHP
微信开发之php表单微信中自动提交两次问题解决办法
Jan 08 PHP
PHP让数组中有相同值的组成新的数组实例
Dec 31 PHP
php + WebUploader实现图片批量上传功能
May 06 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中时间轴开发(刚刚、5分钟前、昨天10:23等)
2011/10/03 PHP
str_replace只替换一次字符串的方法
2013/04/09 PHP
php实现对象克隆的方法
2015/06/20 PHP
PHP上传文件参考配置大文件上传
2015/12/16 PHP
基于php(Thinkphp)+jquery 实现ajax多选反选不选删除数据功能
2017/02/24 PHP
详解Yii2 之 生成 URL 的方法
2017/06/16 PHP
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
jQuery实现按钮点击遮罩加载及处理完后恢复的效果
2016/06/07 Javascript
javascript学习之json入门
2016/12/22 Javascript
详解如何使用webpack+es6开发angular1.x
2017/08/16 Javascript
浅谈使用React.setState需要注意的三点
2017/12/18 Javascript
Angular5集成eventbus的示例代码
2018/07/19 Javascript
element-ui表格列金额显示两位小数的方法
2018/08/24 Javascript
详解webpack引用jquery(第三方模块)的三种办法
2019/08/21 jQuery
python k-近邻算法实例分享
2014/06/11 Python
python中sets模块的用法实例
2014/09/30 Python
Python中解析JSON并同时进行自定义编码处理实例
2015/02/08 Python
使用C语言来扩展Python程序和Zope服务器的教程
2015/04/14 Python
python关闭windows进程的方法
2015/04/18 Python
python比较两个列表是否相等的方法
2015/07/28 Python
深入讲解Python中的迭代器和生成器
2015/10/26 Python
Python实现确认字符串是否包含指定字符串的实例
2018/05/02 Python
如何安装多版本python python2和python3共存以及pip共存
2018/09/18 Python
Django基础知识 URL路由系统详解
2019/07/18 Python
Python时间差中seconds和total_seconds的区别详解
2019/12/26 Python
谈谈对css属性box-sizing的了解
2017/01/04 HTML / CSS
canvas三角函数模拟水波效果的示例代码
2018/07/03 HTML / CSS
基于Modernizr 让网站进行优雅降级的分析
2013/04/21 HTML / CSS
Athleta官网:购买女士瑜伽服、技术运动服和休闲运动服
2020/11/12 全球购物
什么是servlet
2012/05/08 面试题
旅游市场营销方案
2014/03/09 职场文书
校庆标语集锦
2014/06/25 职场文书
电话客服专员岗位职责
2014/06/28 职场文书
学习雷锋月活动总结
2014/07/03 职场文书
Redis三种集群模式详解
2021/10/05 Redis
Android Canvas绘制文字横纵向对齐
2022/06/05 Java/Android