我正在尝试从 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);
?>
先谢谢!
答案 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);
}