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机构的公钥证书,用来验证网站的证书是否是这些机构颁发的

时间: 2024-09-19 09:48:11

PHP CURL访问HTTPS使用的相关文章

php使用curl访问https示例分享

 curl是利用URL语法在命令行方式下工作的开源文件传输工具,下面介绍一下php使用curl访问https的示例,大家参考使用吧 为方便说明,先上代码吧   代码如下: /**   * curl POST   *   * @param   string  url   * @param   array   数据   * @param   int     请求超时时间   * @param   bool    HTTPS时是否进行严格认证   * @return  string   */   fu

php使用curl访问https示例分享_php实例

为方便说明,先上代码吧 复制代码 代码如下: /**  * curl POST  *  * @param   string  url  * @param   array   数据  * @param   int     请求超时时间  * @param   bool    HTTPS时是否进行严格认证  * @return  string  */  function curlPost($url, $data = array(), $timeout = 30, $CA = true){      

PHP CURL访问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(     

PHP的curl扩展不能访问https的连接

网站支付需要和财付通进行一个对接,财付通给了一个https的接口连接 将此连接放入到PHP的页面中调用curl获取此链接的返回信息, 发现使用curl访问此https的连接有问题, 然后随便找了一个http的连接试了试是正常的 看来是curl访问https类型的连接有问题 应该是openssl有猫腻, 然后重新编译安装了一下openssl 下载地址:http://www.openssl.org/source/ openssl 编译 ./config --prefix=/usr/local/ope

centos系统中php Curl 无法访问https ,ssl_version 是 NSS,不是openssl

首先确定php是否已经安装扩展curl和openssl,如果没有请略过... 查看phpinfo  发现curl 会发现 curl 7.19.7  libcurl/7.19.7   NSS/3.19.1 Basic ECC (而不是openssl) 因为centos 6.5(我是用的版本,其他版本没有测试)默认安装curl是用ssl的版本是NSS 所以需要对Curl进行重新编译 先去官方下载 http://curl.haxx.se/download/archeology/ 我依然下载是7.19.

我nignx 服务器 curl 地址https 报502错误是什么原因啊

问题描述 我nignx 服务器 curl 地址https 报502错误是什么原因啊 我nignx 服务器 curl 地址https 报502错误是什么原因啊 代码 $curl = curl_init(); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_TIMEOUT, 500); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl

php采用curl访问域名返回405 method not allowed提示的解决方法_php技巧

/** * http测试 * 注:PHP版本5.2以上才支持CURL_IPRESOLVE_V4 * @param $url 网站域名 * @param $type 网站访问协议 * @param $ipresolve 解析方式 */ public function web_http($url,$type,$ipresolve) { //设置Header头 $header[] = "Accept: application/json"; $header[] = "Accept-E

解决IE 没法访问https 的问题

解决IE 没法访问https 的问题 点击"Internet 选项", 进入"高级"选项卡,然后选中

iOS访问https ssl和tls双向加密

文章已经移到此处:http://www.henishuo.com/ios-https-tls-ssl/ 关于https和ssl的原理,请到此处查看:http://blog.163.com/magicc_love/blog/static/185853662201321423527263/ 由于项目需求,访问服务是https的,并且使用的是ssl加密方式 下面说明使用MKNetworkit网络库实现的代码: - (void)testClientCertificate { SecIdentityRef