PHP - 使用HTTPS的CURL

时间:2017-08-02 04:54:40

标签: php curl

我正在尝试从 https 网址获取Json数据。

我已经测试并运行了代码来为 http 执行此操作... 但我还没有找到 https 的工作版本。这需要是安全的代码,而不是快速修复...

这是我的 http 版本

<?php
$key = "admin"; //user
$secret = "admin"; //pass
$api_ep = "http://$Hostname:$Port/$address";


if ($key && $secret){
$curl_opts = array(
  CURLOPT_HTTPHEADER=>array("Accept: application/json"),
  CURLOPT_VERBOSE=>false,
  CURLOPT_HEADER=>false,
  CURLOPT_POST=>false,
  CURLOPT_RETURNTRANSFER=>true,
  CURLOPT_HTTPAUTH=>CURLAUTH_DIGEST,
  CURLOPT_USERPWD=>$key.":".$secret,
  CURLOPT_URL=> $api_ep  
);
}

function disp($opts,$var){
  $ch = curl_init();

  curl_setopt_array($ch, $opts);
  $raw_resp = curl_exec($ch);
//  $array_resp = json_decode($raw_resp);

  //print_r($array_resp);
  print_r($raw_resp);
  curl_close($ch);
//$array = json_decode($raw_resp, true);
//print_r($array_resp);
//disp_table($array_resp, $var);
}

disp($curl_opts,$Type);
?>

先谢谢!

3 个答案:

答案 0 :(得分:1)

如果您没有任何敏感数据,可以尝试将CURLOPT_SSL_VERIFYPEER设为FALSE

否则,您必须验证证书。

由于Curl没有内置的根证书。您需要将其明确指向cacert.pem文件:

  curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cert/file/cacert.pem');

如果没有这个,curl无法验证通过ssl发回的证书。每次在curl中使用SSL时,都可以使用相同的根证书文件。

您可以在此处获取cacert.pem文件:http://curl.haxx.se/docs/caextract.html

注意:

CURLOPT_SSL_VERIFYPEER设置为false允许man-in-the-middle-attacks。 rmckay at webaware dot com dot au在nl3.php.net/manual/en/function.curl-setopt.php上发出警告并提供了另一种解决方案:在curl网站下载CA根证书包并将其保存在服务器上。查看给定站点,向下滚动到用户评论

答案 1 :(得分:0)

以下代码适用于https。

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $basicAuthUrl);
    $header = array();
    $header[] = 'Content-length: 29';
    $header[] = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8';
    $header[] = 'Authorization: Basic ' . $keyAndSecretEncoded;
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);      
    curl_setopt($ch, CURLOPT_POSTFIELDS, "grant_type=client_credentials");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);

    $result = curl_exec($ch);
    curl_close($ch);

答案 2 :(得分:-1)

添加以下内容以禁用SSL验证。

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

卷曲SSL无法验证自签名证书,因此,如果使用自签名证书,您将无法与https主机连接。

function disp($opts,$var){
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  curl_setopt_array($ch, $opts);
  $raw_resp = curl_exec($ch);
  print_r($raw_resp);
  curl_close($ch);
}