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 调用远程url的六种方法小结
Nov 02 PHP
PHP下打开URL地址的几种方法小结
May 16 PHP
php HandlerSocket的使用
May 02 PHP
thinkphp3.0 模板中函数的使用
Nov 13 PHP
使用YUI+Ant 实现JS CSS压缩
Sep 02 PHP
php结合正则批量抓取网页中邮箱地址
May 19 PHP
php比较两个字符串长度的方法
Jul 13 PHP
简介WordPress中用于获取首页和站点链接的PHP函数
Dec 17 PHP
php使用PDO获取结果集的方法
Feb 16 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
Sep 22 PHP
PHP中将一个字符串部分字符用星号*替代隐藏的实现代码
Sep 08 PHP
laravel-admin select框默认选中的方法
Oct 03 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 将bmp图片转为jpg等其他任意格式的图片
2009/06/29 PHP
PHP 获取客户端真实IP地址多种方法小结
2010/05/15 PHP
PHP中提问频率最高的11个面试题和答案
2014/09/02 PHP
PHP生成RSS文件类实例
2014/12/05 PHP
8个PHP数组面试题
2015/06/23 PHP
Centos PHP 扩展Xchche的安装教程
2016/07/09 PHP
PHP实现随机生成水印图片功能
2017/03/22 PHP
对YUI扩展的Gird组件 Part-2
2007/03/10 Javascript
javascript与css3动画结合使用小结
2015/03/11 Javascript
ES6新数据结构Map功能与用法示例
2017/03/31 Javascript
详解react如何在组件中获取路由参数
2017/06/15 Javascript
JavaScript中立即执行函数实例详解
2017/11/04 Javascript
vue-cli脚手架搭建的项目去除eslint验证的方法
2018/09/29 Javascript
vue.js实现会动的简历(包含底部导航功能,编辑功能)
2019/04/08 Javascript
vue.js实现图书管理功能
2019/09/24 Javascript
vue自定义指令和动态路由实现权限控制
2020/08/28 Javascript
小程序点餐界面添加购物车左右摆动动画
2020/09/23 Javascript
[59:35]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第一场 1月8日
2021/03/11 DOTA
Python做文本按行去重的实现方法
2016/10/19 Python
numpy.random.seed()的使用实例解析
2018/02/03 Python
Python遍历numpy数组的实例
2018/04/04 Python
python中返回矩阵的行列方法
2018/04/04 Python
python matplotlib 绘图 和 dpi对应关系详解
2020/03/14 Python
Python3爬虫mitmproxy的安装步骤
2020/07/29 Python
html5 canvas简单封装一个echarts实现不了的饼图
2018/06/12 HTML / CSS
美国知名运动产品零售商:Foot Locker
2016/07/23 全球购物
MCM英国官网:奢侈皮具制品
2017/04/18 全球购物
英国和世界各地鲜花速递专家:Arena Flowers
2018/02/10 全球购物
英国亚马逊官方网站:Amazon.co.uk
2019/08/09 全球购物
酒店开业庆典策划方案
2014/05/28 职场文书
我是特种兵观后感
2015/06/11 职场文书
预备党员表决心的话
2015/09/22 职场文书
某药房的新员工入职告知书!
2019/07/15 职场文书
将图片保存到mysql数据库并展示在前端页面的实现代码
2021/05/02 MySQL
MongoDB连接数据库并创建数据等使用方法
2021/11/27 MongoDB
python 离散点图画法的实现
2022/04/01 Python