PHP - CURL using HTTPS



我正在尝试从httpsurl获取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);
?>

如果您没有任何敏感数据,可以尝试将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. webaware dot com dot au 的 rmckay 在 nl3.php.net/manual/en/function.curl-setopt.php 上对此发出警告,并给出了一个可行的替代解决方案:在 curl 网站上下载 CA 根证书包并将其保存在您的服务器上。查看给定站点,向下滚动到用户评论

下面的代码适用于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);

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

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

Curl 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);
}

最新更新