无法让curl_exec对付HTTPS网址

时间:2016-05-04 19:15:42

标签: php ssl curl https ssl-certificate

我正在尝试使用PHP curl_exec从使用HTTPS协议的网站获取一些信息。我在Windows服务器上使用PHP。

我遇到了尝试让SSL正常工作的主要问题。

这是我的代码:

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$response = curl_exec($ch);
curl_close($ch);
$json = json_decode($response, true);
//-------------------------------------
$invIndexes = [];
foreach($json->rgInventory as $index){
    $invIndexes = $index;
}
//-------------------------------------
$makearray = (array)$invIndexes;
for($id = 0;$id < count($invIndexes);$id++){
    $index = $makearray[$id];
    $item = $json->rgDescriptions[$json->rgInventory[$index]->classid + "_" + $json->rgInventory[$index]->instanceid];
    if($item->tradeable != 1){
        continue;
    }
    $ItemName = $item->market_hash_name;
}
var_dump($ItemName);

我从这里获得了ca证书 - https://curl.haxx.se/ca/cacert.pem

我刚刚从那里复制文本并使用文本编辑器将其保存为.pem文件,这应该是正确的吗?

我得到的问题是:

  

与www.dublinairport.com:443相关的未知SSL协议错误

我在stackoverflow上尝试了其他几种解决方案,包括强制SSL版本为1,2和3。

有关我尝试点击https:google.com时的其他信息,我会收到如下错误:

  

SSL证书问题,验证CA证书是否正常。细节:   错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书   验证失败

所以我不知道下一步应该尝试解决这个问题?

1 个答案:

答案 0 :(得分:1)

适合我。可能不是你想听到的答案。 :)

要回答您的第一个问题,是的,通过文本编辑器将CA证书放入文件中就可以了。我一开始认为它可能是一个Windows行结束问题,但我确认curl适用于UNIX和Windows行结尾(也可能是Mac,但该系统不涉及此问题)。

回答你的第二个问题。首先,我将为您的脚本添加调试:

$url = 'https://www.dublinairport.com/flight-information/live-departures';

$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem");
curl_setopt($curl_handle, CURLOPT_URL, $url);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($handle, CURLOPT_VERBOSE, true);
$verbose = fopen('php://temp', 'w+');
curl_setopt($handle, CURLOPT_STDERR, $verbose);

$raw = curl_exec($curl_handle);
if (false === $raw) {
    var_dump(curl_error($curl_handle));
    rewind($verbose);
    var_dump(stream_get_contents($verbose));
} else {
    var_dump($raw);
}

curl_close($curl_handle);

其次,我会检查代理您请求的任何中间人。当我与一个声称安全的站点的连接被一个非安全的询问代理拦截时,我只看到了“未知的SSL协议错误”(想想一个代理,要求我的浏览器在使用有线服务之前接受服务条款)。这可能是这种情况,如(a)错误为您提供显式端口号,即使您隐式指定它并且(b)它正在发生不止一个网站。

简而言之,我认为这不是代码问题。我认为这是您服务器向外的网络问题。