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+DBM的同学录程序(1)
Oct 09 PHP
PHP与SQL注入攻击[三]
Apr 17 PHP
php minixml详解
Jul 19 PHP
php chr() ord()中文截取乱码问题解决方法
Sep 08 PHP
分享一个PHP数据流应用的简单例子
Jun 01 PHP
实现获取http内容的php函数分享
Feb 16 PHP
php创建桌面快捷方式实现方法
Dec 31 PHP
php学习笔记之mb_strstr的基本使用
Feb 03 PHP
浅析PHP开发规范
Feb 05 PHP
PDO::beginTransaction讲解
Jan 27 PHP
PHP设计模式(四)原型模式Prototype实例详解【创建型】
May 02 PHP
tp5.1 框架数据库常见操作详解【添加、删除、更新、查询】
May 26 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
日本收入最高的漫画家:海贼王作者版税年收入高达8.45亿元
2020/03/04 日漫
在php中使用sockets:从新闻组中获取文章
2006/10/09 PHP
PHP实现微信公众平台音乐点播
2014/03/20 PHP
CI框架简单邮件发送类实例
2016/05/18 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
2017/09/22 PHP
json简单介绍
2008/06/10 Javascript
Firefox getBoxObjectFor getBoundingClientRect联系
2008/10/26 Javascript
JS中动态添加事件(绑定事件)的代码
2011/01/09 Javascript
JavaScript中的noscript元素属性位置及作用介绍
2013/04/11 Javascript
jQuery控制DIV层实现由大到小,由远及近动画变化效果
2015/10/09 Javascript
jQuery实现分隔条左右拖动功能
2015/11/21 Javascript
学习JavaScript设计模式(链式调用)
2015/11/26 Javascript
jQuery修改DOM结构_动力节点Java学院整理
2017/07/05 jQuery
bootstrap modal+gridview实现弹出框效果
2017/08/15 Javascript
微信小程序自定义组件实现tabs选项卡功能
2018/07/14 Javascript
nodejs微信开发之接入指南
2019/03/17 NodeJs
基于iview的router常用控制方式
2019/05/30 Javascript
微信小程序-可移动菜单的实现过程详解
2019/06/24 Javascript
Windows上node.js的多版本管理工具用法实例分析
2019/11/06 Javascript
Python实现各种排序算法的代码示例总结
2015/12/11 Python
简单讲解Python中的字符串与字符串的输入输出
2016/03/13 Python
深入解析Python中的上下文管理器
2016/06/28 Python
django使用图片延时加载引起后台404错误
2017/04/18 Python
python中的迭代和可迭代对象代码示例
2017/12/27 Python
浅谈Python实现2种文件复制的方法
2018/01/19 Python
python定时按日期备份MySQL数据并压缩
2019/04/19 Python
使用Python脚本从文件读取数据代码实例
2020/01/19 Python
3D动画《斗罗大陆》上线当日播放过亿
2021/03/16 国漫
Maisons du Monde德国:法国家具和装饰的市场领导者
2019/07/26 全球购物
俄罗斯皮肤健康中心:Pharmacosmetica.ru
2020/02/22 全球购物
第二课堂活动总结
2014/05/07 职场文书
小学同学聚会感言
2015/07/30 职场文书
用python自动生成日历
2021/04/24 Python
Python深度学习之实现卷积神经网络
2021/06/05 Python
Python将CSV文件转化为HTML文件的操作方法
2021/06/30 Python
MySQL中LAG()函数和LEAD()函数的使用
2022/08/14 MySQL