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 相关文章推荐
提问的智慧
Oct 09 PHP
论坛头像随机变换代码
Oct 09 PHP
在php中使用sockets:从新闻组中获取文章
Oct 09 PHP
同时提取多条新闻中的文本一例
Oct 09 PHP
How do I change MySQL timezone?
Mar 26 PHP
Ajax PHP简单入门教程代码
Apr 25 PHP
PHP-Fcgi下PHP的执行时间设置方法
Aug 02 PHP
php实现mysql封装类示例
May 07 PHP
CI框架中site_url()和base_url()的区别
Jan 07 PHP
给PHP开发者的编程指南 第一部分降低复杂程度
Jan 18 PHP
php创建图像具体步骤
Mar 13 PHP
php layui实现前端多图上传实例
Jul 30 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读写文件的方法(生成HTML)
2006/11/27 PHP
phpmyadmin 3.4 空密码登录的实现方法
2010/05/29 PHP
PHP源码之explode使用说明
2011/08/05 PHP
从性能方面考虑PHP下载远程文件的3种方法
2015/12/29 PHP
Yii框架组件和事件行为管理详解
2016/05/20 PHP
php获取远程图片并下载保存到本地的方法分析
2016/10/08 PHP
php获取excel文件数据
2017/04/21 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
2017/06/06 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
PHP实现类似题库抽题效果
2018/08/16 PHP
javascript JSON操作入门实例
2010/04/16 Javascript
jquery批量控制form禁用的代码
2013/08/06 Javascript
jQuery实现单击弹出Div层窗口效果(可关闭可拖动)
2015/09/19 Javascript
JS打印组合功能
2016/08/04 Javascript
基于jQuery实现歌词滚动版音乐播放器的代码
2016/09/17 Javascript
Node.js Sequelize如何实现数据库的读写分离
2016/10/23 Javascript
微信小程序开发之Tabbar实例详解
2017/01/09 Javascript
vue-cli 目录结构详细讲解总结
2019/01/15 Javascript
使用axios发送post请求,将JSON数据改为form类型的示例
2019/10/31 Javascript
Python和perl实现批量对目录下电子书文件重命名的代码分享
2014/11/21 Python
了解不常见但是实用的Python技巧
2019/05/23 Python
调整Jupyter notebook的启动目录操作
2020/04/10 Python
Win 10下Anaconda虚拟环境的教程
2020/05/18 Python
如何利用Python写个坦克大战
2020/11/18 Python
英国最好的温室之家:Greenhouses Direct
2019/07/13 全球购物
数控专业大学生的自我鉴定
2013/11/13 职场文书
考试没考好检讨书
2014/01/31 职场文书
营销总监岗位职责范本
2014/02/26 职场文书
关于环保的建议书400字
2014/03/12 职场文书
《大海那边》教学反思
2014/04/09 职场文书
2015年宣传思想工作总结
2015/05/22 职场文书
导师鉴定意见
2015/06/05 职场文书
远程教育培训心得体会
2016/01/09 职场文书
远程教育集中轮训基层干部培训班学习心得体会
2016/01/09 职场文书
工作总结之小学教师体育工作范文(3篇)
2019/10/07 职场文书
导游词之塘栖古镇
2019/12/04 职场文书