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 相关文章推荐
不用mod_rewrite直接用php实现伪静态化页面代码
Oct 04 PHP
php生成N个不重复的随机数实例
Nov 12 PHP
在Yii框架中使用PHP模板引擎Twig的例子
Jun 13 PHP
thinkphp学习笔记之多表查询
Jul 28 PHP
ThinkPHP采用原生query实现关联查询left join实例
Dec 02 PHP
php操作xml入门之cdata区段
Jan 23 PHP
详解WordPress中过滤链接与过滤SQL语句的方法
Dec 18 PHP
PHP生成和获取XML格式数据的方法
Mar 04 PHP
微信支付开发交易通知实例
Jul 12 PHP
PHP用户验证和标签推荐的简单使用
Oct 31 PHP
php mysql procedure实现获取多个结果集的方法【基于thinkPHP】
Nov 09 PHP
Yii2 queue的队列使用详解
Jul 19 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
深入了解php4(1)--回到未来
2006/10/09 PHP
php 执行系统命令的方法
2009/07/07 PHP
使用Linux五年积累的一些经验技巧
2013/06/20 PHP
php防止sql注入之过滤分页参数实例
2014/11/03 PHP
PHP 网站修改默认访问文件的nginx配置
2017/05/27 PHP
PHP创建XML接口示例
2019/07/04 PHP
js本身的局限性 别让javascript做太多事
2010/03/23 Javascript
JavaScript操作Cookie方法实例分析
2015/05/27 Javascript
jQuery原理系列-常用Dom操作详解
2016/06/07 Javascript
Javascript数组循环遍历之forEach详解
2016/11/07 Javascript
JavaScript实现简单的四则运算计算器完整实例
2017/04/28 Javascript
vue router动态路由下让每个子路由都是独立组件的解决方案
2018/04/24 Javascript
vuejs 动态添加input框的实例讲解
2018/08/24 Javascript
ES6入门教程之let、const的使用方法
2019/04/13 Javascript
Vue 2.0 侦听器 watch属性代码详解
2019/06/19 Javascript
layui前端时间戳转化实例
2019/11/15 Javascript
使用Vue生成动态表单
2019/11/26 Javascript
JavaScript中this的学习笔记及用法整理
2020/02/17 Javascript
详解如何修改 node_modules 里的文件
2020/05/22 Javascript
你不知道的SpringBoot与Vue部署解决方案
2020/11/09 Javascript
[00:30]塑造者的传承礼包-戴泽“暗影之焰”套装展示视频
2014/04/04 DOTA
[42:32]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.27
2020/12/01 DOTA
python中is与双等于号“==”的区别示例详解
2017/11/21 Python
TensorFlow设置日志级别的几种方式小结
2020/02/04 Python
python继承threading.Thread实现有返回值的子类实例
2020/05/02 Python
python dict乱码如何解决
2020/06/07 Python
H5 canvas实现贪吃蛇小游戏
2017/07/28 HTML / CSS
SHEIN台湾:购买最新流行女装服饰
2019/05/18 全球购物
Feelunique澳大利亚:欧洲的化妆品零售电商
2019/12/18 全球购物
小学开学寄语
2014/01/19 职场文书
《乌塔》教学反思
2014/02/17 职场文书
机械机修工岗位职责
2014/08/03 职场文书
2014年扶贫工作总结
2014/11/18 职场文书
2015年政协委员工作总结
2015/05/20 职场文书
2016简历自荐信优秀范文
2016/01/29 职场文书
Python 第三方库 openpyxl 的安装过程
2022/12/24 Python