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之第一天
Oct 09 PHP
PHP date()函数警告: It is not safe to rely on the system解决方法
Aug 20 PHP
php中删除数组的第一个元素和最后一个元素的函数
Mar 07 PHP
CodeIgniter删除和设置Cookie的方法
Apr 07 PHP
PHP实现发送邮件的方法(基于简单邮件发送类)
Dec 17 PHP
WordPress中给文章添加自定义字段及后台编辑功能区域
Dec 19 PHP
Yii2 ActiveRecord多表关联及多表关联搜索的实现
Jun 30 PHP
PHP实现登录搜狐广告获取广告联盟数据的方法【附demo源码】
Oct 14 PHP
php使用PDO从数据库表中读取数据的实现方法(必看)
Jun 02 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
Aug 30 PHP
在 Laravel 中 “规范” 的开发短信验证码发送功能
Oct 26 PHP
PHP实现的装箱算法示例
Jun 23 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
一个好用的分页函数
2006/11/16 PHP
推荐Discuz!5的PHP代码高亮显示与实现可运行代码
2007/03/15 PHP
php有道翻译api调用方法实例
2014/12/22 PHP
8个必备的PHP功能开发
2015/10/02 PHP
Js表格万条数据瞬间加载实现代码
2014/02/20 Javascript
javascript引用类型指针的工作方式
2015/04/13 Javascript
js实现超简单的展开、折叠目录代码
2015/08/28 Javascript
jQuery实现下拉框功能实例代码
2016/05/06 Javascript
JS获取地址栏参数的两种方法(简单实用)
2016/06/14 Javascript
javascript自定义事件功能与用法实例分析
2017/11/08 Javascript
浅谈es6中export和export default的作用及区别
2018/02/07 Javascript
微信小程序Getuserinfo解决方案图解
2018/08/24 Javascript
js控制随机数生成概率代码实例
2019/03/21 Javascript
vue-cli3访问public文件夹静态资源报错的解决方式
2020/09/02 Javascript
解决vue props传Array/Object类型值,子组件报错的情况
2020/11/07 Javascript
[43:26]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第二场 11.20
2020/11/23 DOTA
python文件和目录操作函数小结
2014/07/11 Python
python各种语言间时间的转化实现代码
2016/03/23 Python
Python爬虫之xlml解析库(全面了解)
2017/08/08 Python
Python绘制KS曲线的实现方法
2018/08/13 Python
在pycharm中使用git版本管理以及同步github的方法
2019/01/16 Python
python3实现点餐系统
2019/01/24 Python
python使用OpenCV模块实现图像的融合示例代码
2020/04/10 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
2020/07/02 Python
python中pyplot基础图标函数整理
2020/11/10 Python
HTML5仿微信聊天界面、微信朋友圈实例代码
2018/01/29 HTML / CSS
美国时装品牌:Nautica(诺帝卡)
2016/08/28 全球购物
印度尼西亚综合购物网站:Lazada印尼
2016/09/07 全球购物
《吃水不忘挖井人》教学反思
2014/04/15 职场文书
暑假社会实践心得体会
2014/09/02 职场文书
“九一八事变纪念日”国旗下讲话稿
2014/09/14 职场文书
大一新生检讨书
2014/10/29 职场文书
2015年农村党员干部主题教育活动总结
2015/03/25 职场文书
幼儿园教师读书笔记
2015/06/29 职场文书
信息技术研修心得体会
2016/01/08 职场文书
详解在SQLPlus中实现上下键翻查历史命令的功能
2022/03/18 SQL Server