zoukankan      html  css  js  c++  java
  • curl 方式及证书验证跳过设置

    提交数据到https时,需要pem证书来加密。
    我们使用浏览器访问https的时候,浏览器会自动加载网站的安全证书进行加密。但是你用curl请求https时,没有通过浏览器,就只有自己手动增加一个安全证书进行加密。

    curl 请求一共分四步,初始化,设置属性,执行并获取结果,释放句柄
    一 需要验证:
     1 function httpGet($url) {
     2     $curl = curl_init();
     3     curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
     4     curl_setopt($curl, CURLOPT_TIMEOUT, 500);
     5     // 为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,必须使用下面2行代码打开ssl安全校验。
     6     // 如果在部署过程中代码在此处验证失败,请到 http://curl.haxx.se/ca/cacert.pem 下载新的证书判别文件。
     7     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
     8     curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
     9     curl_setopt($curl,CURLOPT_CAINFO,dirname(__FILE__).'/cacert.pem');//这是根据http://curl.haxx.se/ca/cacert.pem 下载的证书,添加这句话之后就运行正常了
    10     curl_setopt($curl, CURLOPT_URL, $url);
    11  
    12     $res = curl_exec($curl);
    13     curl_close($curl);
    14  
    15     return $res;
    16 }

     二 不需要验证:

     1 function getCurl($url) {
     2     // 创建一个新cURL资源
     3     $ch = curl_init();
     4 
     5     // 设置URL和相应的选项
     6     curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 跳过证书验证(https)的网站无法跳过,会报错
     7     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书验证
     8     curl_setopt($ch, CURLOPT_URL, $url);
     9     curl_setopt($ch, CURLOPT_HEADER, 0);
    10     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回的数据不打印
    11     // 抓取URL并把它传递给浏览器
    12     $rs = curl_exec($ch);
    13     if($rs === false) {
    14         return 'Curl error: ' . curl_error($ch);
    15     }
    16     // 关闭cURL资源,并且释放系统资源
    17     curl_close($ch);
    18     return $rs;
    19 }
    /**
    * 发送http请求获取结果json字符串
    *
    * @param $url
    * @param null $data
    * @param string $method
    * @return mixed
    */
     function sendHTTPRequest($url, $data = null,$method = 'post') {
    // 1.初始化
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 跳过证书验证(https)的网站无法跳过,会报错
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书验证
    // 2.设置url
    curl_setopt($ch, CURLOPT_URL, $url);
    // 2.1 设置返回是字符串形式
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    // 2.2 支持POST
    if (!empty($data)) {
    if($method === 'post') {
    curl_setopt($ch, CURLOPT_POST, 1);
     
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    }
    } elseif($method === 'get') {
    //设置头文件的信息作为数据流输出
    curl_setopt($ch, CURLOPT_HEADER, 0);
    }
    // 3.发送接收
    $res = curl_exec($ch);
    // 4.关闭
    curl_close($ch);
     
    return $res;
    }

    知识点摘要:
    CURLOPT_SSL_VERIFYPEER 设置为FALSE 禁止 cURL 验证对等证书(peer’s certificate)。要验证的交换证书可以在 CURLOPT_CAINFO 选项中设置,或在 CURLOPT_CAPATH中设置证书目录。

    CURLOPT_CAINFO 一个保存着1个或多个用来让服务端验证的证书的文件名。这个参数仅仅在和CURLOPT_SSL_VERIFYPEER一起使用时才有意义。可能需要绝对路径。

    CURLOPT_CAPATH 一个保存着多个CA证书的目录。这个选项是和CURLOPT_SSL_VERIFYPEER一起使用的。

    CURLOPT_SSL_VERIFYHOST 设置为 1 是检查服务器SSL证书中是否存在一个公用名(common name)。译者注:公用名(Common Name)一般来讲就是填写你将要申请SSL证书的域名 (domain)或子域名(sub domain)。 设置成 2,会检查公用名是否存在,并且是否与提供的主机名匹配。 在生产环境中,这个值应该是 2(默认值)。

  • 相关阅读:
    Gym
    数学公式头文件
    除法取模(比赛常用)
    ACM-ICPC 2017 Asia Urumqi A. Coins【期望dp】
    P1494 小Z的袜子 【普通莫队】
    Codeforces Round #642 (Div. 3) E—K-periodic Garland dp
    luogu P4568 [JLOI2011]飞行路线 最短路Dijkstra+dp
    luogu P2015 二叉苹果树 树形dp
    luogu P1462 通往奥格瑞玛的道路 二分+spfa
    luogu P1879 [USACO06NOV]Corn Fields G 状态压缩dp
  • 原文地址:https://www.cnblogs.com/init-007/p/10731659.html
Copyright © 2011-2022 走看看