您当前的位置: 首页 > 网站编程 > PHP教程 > PHP CURL访问HTTPS使用

PHP CURL访问HTTPS使用

作者:不详 来源:网络 发布时间: 2014-08-12 10:10 点击:
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

PHP CURL访问HTTPS使用

  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.111cn.net', 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 

   

     $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)查看具体错误信息。)此时可以根据情况通过降低验证程度来保证正常访问,例如:

  

  

  

  

  

  

  

  

  

  

  
代码如下


  2 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);

  


  // 检查证书中是否设置域名(为0也可以,就是连域名存在与否都不验证了)

  平时我们使用浏览器访问各个https网站时,有时会遇到证书不受信的提示,其实就是因为这些网站的证书不是正规CA机构颁布的。

  市面上各种浏览器中都内置了CA根证书列表信息,访问有CA颁布证书的网站时,会根据根证书验证这些网站的证书,所以就不会有这个提示了。

  关于CA根证书文件,其实就是包含了各个主要CA机构的公钥证书,用来验证网站的证书是否是这些机构颁发的
分享到:
本文"PHP CURL访问HTTPS使用"由远航站长收集整理而来,仅供大家学习与参考使用。更多网站制作教程尽在远航站长站。
顶一下
(0)
0%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 广告合作 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(远航站长). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类网站制作教程.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4