加入收藏 | 设为首页 | 会员中心 | 我要投稿 广州站长网 (https://www.020zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP CURL访问HTTPS使用解析

发布时间:2022-02-18 18:36:11 所属栏目:PHP教程 来源:互联网
导读:如果你直接使用PHP CURL函数来抓取http内容可能没有任何问题了,但是如果你要正抓取的是https文件才会发现本文章帮你解决了一个大难题了,下面我们来看看具体操作过程. 三年前写过一篇《一个简陋的支持HTTPS的PHP CURL封装函数》,当时只是知其然不知其所以然
  如果你直接使用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.Cuoxin.com', array('p'=>'hello'));
  echo ($data);
  其实这是告诉服务器不进行SSL认证,并不是真的走HTTPS,如果要真正使用HTTPS,那么需要提供CA证书.
       $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  //开源代码Cuoxin.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); // 检查证书中是否设置域名,并且是否与提供的主机名匹配  
  
  市面上各种浏览器中都内置了CA根证书列表信息,访问有CA颁布证书的网站时,会根据根证书验证这些网站的证书,所以就不会有这个提示了.
 
  关于CA根证书文件,其实就是包含了各个主要CA机构的公钥证书,用来验证网站的证书是否是这些机构颁发的.

(编辑:广州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读