file_get_contents忽略verify_peer => false?

时间:2013-02-25 21:28:13

标签: php ssl https

带有https主机的

file_get_contents工作得很好,除了特定主机(来自某公司的测试api服务器 - ip白名单,不能给你测试URL)。这排除了未加载https模块和其他初始设置错误。

我已经测试了多个PHP安装,全部是v5.3.3,32位,Debian 32位。

请求适用于cURL,但仅限于设置curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);。但是,在file_get_contents的上下文中设置verify_peer"=>false似乎没有任何区别。

使用file_get_contents,完全相同的请求(相同的URL,相同的XML POST数据)失败, SSL:由同行重置连接

$arrContextOptions=array(
    "http" => array(
        "method" => "POST",
        "header" => 
            "Content-Type: application/xml; charset=utf-8;\r\n".
            "Connection: close\r\n",
        "ignore_errors" => true,
        "timeout" => (float)30.0,
        "content" => $strRequestXML,
    ),
    "ssl"=>array(
        "allow_self_signed"=>true,
        "verify_peer"=>false,
    ),
);

file_get_contents("https://somedomain:2000/abc/", false, stream_context_create($arrContextOptions));

有没有人遇到过file_get_contents? 任何想法如何调试?

5 个答案:

答案 0 :(得分:4)

您错过了verify_peer_name。如果您也将其设置为false,则请求有效:

$arrContextOptions=array(
    "http" => array(
        "method" => "POST",
        "header" => 
            "Content-Type: application/xml; charset=utf-8;\r\n".
            "Connection: close\r\n",
        "ignore_errors" => true,
        "timeout" => (float)30.0,
        "content" => $strRequestXML,
    ),
    "ssl"=>array(
        "allow_self_signed"=>true,
        "verify_peer"=>false,
        "verify_peer_name"=>false,
    ),
);

file_get_contents("https://somedomain:2000/abc/", false, stream_context_create($arrContextOptions));

答案 1 :(得分:1)

不知道这是否真的有帮助,但请尝试从您的选项数组中删除SSL选项。

背后的原因: 根据{{​​3}},verify_peer默认为false

allow_self_signed需要verify_peer,默认为false

根据上述内容,我认为allow_self_signed可能会覆盖您verify_peer的设置。

所以请在SSLallow_self_signed没有任何选项的情况下尝试,如果有帮助,请告诉我们。

答案 2 :(得分:0)

您可以尝试使用Wireshark进行调试 - 您可能会更好地了解出现了什么问题,您应该看到发生了哪些SSL错误。

答案 3 :(得分:0)

试试这段代码:

$fp = fsockopen("ssl://somedomain/abc/", 2000 , $ErrNo, $ErrString, 30);
if (!$fp) {
    echo "Error No : $ErrNo - $ErrString <br />\n";
} else {
    $out  = "POST / HTTP/1.1\r\n";
    $out .= "Host: somedomain \r\n";
    $out .= "Content-Type: application/xml; charset=utf-8;\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
}

如果你没有收到错误,我认为问题(使用file_get_contents)是客户端php配置,否则来自服务器配置。

答案 4 :(得分:-1)

仅安装此

yum install ca-certificates.noarch