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目录管理函数小结
Sep 10 PHP
php设计模式 Factory(工厂模式)
Jun 26 PHP
PHP中集成PayPal标准支付的实现方法分享
Feb 06 PHP
PHP setTime 设置当前时间的代码
Aug 27 PHP
php通过文件流方式复制文件的方法
Mar 13 PHP
使用PHP实现下载CSS文件中的图片
Dec 06 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
Mar 25 PHP
PHP+Mysql+Ajax实现淘宝客服或阿里旺旺聊天功能(前台页面)
Jun 16 PHP
PHP基于IMAP收取邮件的方法示例
Aug 07 PHP
Laravel5框架添加自定义辅助函数的方法
Aug 01 PHP
php实现数组中出现次数超过一半的数字的统计方法
Oct 14 PHP
Yii框架组件的事件机制原理与用法分析
Apr 07 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带密码功能并下载远程文件保存本地指定目录 修改加强版
2010/05/16 PHP
那些年一起学习的PHP(一)
2012/03/21 PHP
PHP面向对象——访问修饰符介绍
2012/11/08 PHP
PHP实现一维数组与二维数组去重功能示例
2018/05/24 PHP
JS判断不同分辨率调用不同的CSS样式文件实现思路及测试代码
2013/01/23 Javascript
JavaScript实现自己的DOM选择器原理及代码
2013/03/04 Javascript
JavaScript实现输入框与清空按钮联动效果
2016/09/09 Javascript
JS switch判断 三目运算 while 及 属性操作代码
2017/09/03 Javascript
安装vue-cli报错 -4058 的解决方法
2017/10/19 Javascript
Node.js中,在cmd界面,进入退出Node.js运行环境的方法
2018/05/12 Javascript
详解vue 数组和对象渲染问题
2018/09/21 Javascript
跨域请求两种方法 jsonp和cors的实现
2018/11/11 Javascript
vue计算属性computed、事件、监听器watch的使用讲解
2019/01/21 Javascript
JS中的一些常用的函数式编程术语
2019/06/15 Javascript
微信小程序点击view动态添加样式过程解析
2020/01/21 Javascript
OpenLayer3自定义测量控件MeasureTool
2020/09/28 Javascript
Nuxt 嵌套路由nuxt-child组件用法(父子页面组件的传值)
2020/11/05 Javascript
python基础教程之循环介绍
2014/08/29 Python
Python获取服务器信息的最简单实现方法
2015/03/05 Python
深入探究Python中变量的拷贝和作用域问题
2015/05/05 Python
机器学习的框架偏向于Python的13个原因
2017/12/07 Python
Python模拟简单电梯调度算法示例
2018/08/20 Python
详解python-图像处理(映射变换)
2019/03/22 Python
Django 创建/删除用户的示例代码
2019/07/24 Python
Python3进制之间的转换代码实例
2019/08/24 Python
python datetime处理时间小结
2020/04/16 Python
keras.utils.to_categorical和one hot格式解析
2020/07/02 Python
pycharm不以pytest方式运行,想要切换回普通模式运行的操作
2020/09/01 Python
python os.listdir()乱码解决方案
2021/01/31 Python
玖熙女鞋美国官网:Nine West
2016/10/06 全球购物
奥地利度假券的专家:we-are.travel
2019/04/10 全球购物
国际经济贸易专业推荐信
2013/11/06 职场文书
财务管理专业自荐信范文
2013/12/24 职场文书
纠风工作实施方案
2014/03/15 职场文书
社区国庆节活动总结
2015/03/23 职场文书
Android开发之底部导航栏的快速实现
2022/04/28 Java/Android