PHP CURL访问HTTPS使用详解
发布:smiling 来源: PHP粉丝网 添加日期:2014-09-22 15:41:58 浏览: 评论:0
如果你直接使用PHP CURL函数来抓取http内容可能没有任何问题了,但是如果你要正抓取的是https文件才会发现本文章帮你解决了一个大难题了,下面我们来看看具体操作过程.
三年前写过一篇《一个简陋的支持HTTPS的PHP CURL封装函数》,当时只是知其然不知其所以然,今天来详细梳理一下.
https服务器post数据,代码如下:
- function curlPost($url, $data, $timeout = 30)
- {
- $ssl = substr($url, 0, 8) == "https://" ? TRUE : FALSE;
- $ch = curl_init();
- $opt = array(
- CURLOPT_URL => $url,
- CURLOPT_POST => 1,
- CURLOPT_HEADER => 0,
- CURLOPT_POSTFIELDS => (array)$data,
- CURLOPT_RETURNTRANSFER => 1,
- CURLOPT_TIMEOUT => $timeout,
- );
- if ($ssl)
- {
- $opt[CURLOPT_SSL_VERIFYHOST] = 1;
- $opt[CURLOPT_SSL_VERIFYPEER] = FALSE;
- }
- curl_setopt_array($ch, $opt);
- $data = curl_exec($ch);
- curl_close($ch);
- return $data;
- }
- $data = curlPost('https://www.phpfensi.com', array('p'=>'hello'));
- echo ($data);
其实这是告诉服务器不进行SSL认证,并不是真的走HTTPS,如果要真正使用HTTPS,那么需要提供CA证书.
上面关于SSL部分按照如下设置:
01.CURLOPT_SSL_VERIFYPEER 设置为 true,说明进行SSL证书认证
02.CURLOPT_SSL_VERIFYHOST 设置为 2,说明进行严格认证
03.CURLOPT_CAINFO 设置为证书的路径
为方便说明,先上代码吧~ 这是今天重新封装的一个函数,代码如下:
- /**
- * 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 //开源代码phpfensi.com
- $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_VERIFYHOST, 1);
检查证书中是否设置域名,为0也可以,就是连域名存在与否都不验证了,平时我们使用浏览器访问各个https网站时,有时会遇到证书不受信的提示,其实就是因为这些网站的证书不是正规CA机构颁布的.
市面上各种浏览器中都内置了CA根证书列表信息,访问有CA颁布证书的网站时,会根据根证书验证这些网站的证书,所以就不会有这个提示了.
关于CA根证书文件,其实就是包含了各个主要CA机构的公钥证书,用来验证网站的证书是否是这些机构颁发的.
Tags: PHP CURL HTTPS使用
- 上一篇:分享一个PHP采集远程图片
- 下一篇:PHP利用QQ免费邮箱发送邮件实例
相关文章
- ·PHP中通过Web 执行C/C++应用程序(2013-11-13)
- ·用PHP实现Ftp用户的在线管理(2013-11-13)
- ·用PHP自动把纯文本转换成Web页面(2013-11-13)
- ·用实例分析PHP5异常处理(2013-11-13)
- ·php5的simplexml解析错误(2013-11-13)
- ·PHP后门的隐藏技巧测试报告(2013-11-13)
- ·PHP缓存技术详谈(2013-11-27)
- ·利用PHP自定义错误处理器处理出错信息(2013-11-27)
- ·PHP作wap开发时遇到的问题(2013-11-27)
- ·php编写大型网站问题集(2013-11-27)
- ·php测试性能代码(2013-11-28)
- ·php 安全register globals设置为TRUE的危害(2013-11-28)
- ·XSLTProcessor 中 registerPHPFunctions 后无法调用 php 函数(2013-11-30)
- ·PHP中常用三种缓存技术(2013-11-30)
- ·新浪微博PHP版SDK的导致20007错误(2013-12-03)
- ·linux中phpMyAdmin错误提示Wrong permissions on configuration file, should no(2013-12-04)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)