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 字符串替换的方法
Jan 10 PHP
PHP删除目录及目录下所有文件的方法详解
Jun 06 PHP
解析PHP无限级分类方法及代码
Jun 21 PHP
getJSON跨域SyntaxError问题分析
Aug 07 PHP
php实现将字符串按照指定距离进行分割的方法
Mar 14 PHP
PHP编写的图片验证码类文件分享
Jun 06 PHP
php多文件打包下载的实例代码
Jul 12 PHP
PHP长网址与短网址的实现方法
Oct 13 PHP
thinkPHP框架中执行事务的方法示例
May 31 PHP
PHP绕过open_basedir限制操作文件的方法
Jun 10 PHP
thinkPHP5框架实现基于ajax的分页功能示例
Jun 12 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
第十三节 对象串行化 [13]
2006/10/09 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
php中isset与empty函数的困惑与用法分析
2019/07/05 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
使用javascript获取flash加载的百分比的实现代码
2011/05/25 Javascript
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
2012/05/24 Javascript
JS中实现replaceAll的方法(实例代码)
2013/11/12 Javascript
jQuery 2.0.3 源码分析之core(一)整体架构
2014/05/27 Javascript
通过js为元素添加多项样式,浏览器全兼容写法
2014/08/30 Javascript
js单独获取一个checkbox看其是否被选中
2014/09/22 Javascript
js继承call()和apply()方法总结
2014/12/08 Javascript
浅析Node.js中使用依赖注入的相关问题及解决方法
2015/06/24 Javascript
node.js发送邮件email的方法详解
2017/01/06 Javascript
ligerUI---ListBox(列表框可移动的实例)
2017/11/28 Javascript
React-native桥接Android原生开发详解
2018/01/17 Javascript
使用webpack打包koa2 框架app
2018/02/02 Javascript
Vue-cli3.x + axios 跨域方案踩坑指北
2019/07/04 Javascript
JS数组降维的实现Array.prototype.concat.apply([], arr)
2020/04/28 Javascript
Python数组遍历的简单实现方法小结
2016/04/27 Python
Python中动态检测编码chardet的使用教程
2017/07/06 Python
Python实现读取txt文件并转换为excel的方法示例
2018/05/17 Python
python 使用pandas计算累积求和的方法
2019/02/08 Python
Python 给屏幕打印信息加上颜色的实现方法
2019/04/24 Python
Python3.5局部变量与全局变量作用域实例分析
2019/04/30 Python
解决jupyter运行pyqt代码内核重启的问题
2020/04/16 Python
PyCharm+Miniconda3安装配置教程详解
2021/02/16 Python
基于HTML5的WebGL经典3D虚拟机房漫游动画
2017/11/15 HTML / CSS
移动端html5判断是否滚动到底部并且下拉加载
2019/11/19 HTML / CSS
在html页面中取得session中的值的方法
2020/08/11 HTML / CSS
物业工作计划书
2014/01/10 职场文书
外语系大学生自荐信范文
2014/03/01 职场文书
开业典礼主持词
2014/03/21 职场文书
《雨点儿》教学反思
2014/04/14 职场文书
工地材料员岗位职责
2015/04/11 职场文书
在 HTML 页面中使用 React的场景分析
2022/01/18 Javascript
Win11自动黑屏怎么办 Win11自动黑屏设置教程
2022/07/15 数码科技