File_get_contents игнорирует verify_peer => false?

file_get_contents хост https работает отлично, за исключением конкретного хоста (тестовый сервер api из какой-то компании - ip whitelisted, не может дать вам URL для тестирования). Это исключает не загруженные модули https и другие ошибки начальной настройки.

Я тестировал с несколькими установками PHP, все в версиях v5.3.3, 32bits, 32bits Debian.

Запрос работает с cURL, но только при установке curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);. Однако установка verify_peer"=>false в контексте для file_get_contents, по-видимому, не имеет значения.

С файлом_get_contents, тот же самый запрос (тот же URL-адрес, то же XML-POST-данные) терпит неудачу с SSL: Connection reset by peer:

$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));

.

Кто-нибудь сталкивался с файлом_get_contents? Любые идеи отладки?

Ответ 1

попробуйте этот код:

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

если вы не получите ошибку, я думаю, что проблема (с файлом_get_contents) заключается в конфигурации php клиента php в противном случае из конфигурации сервера.

Ответ 2

dont 'знает, действительно ли это поможет, но попытайтесь удалить опции SSL из вашего массива параметров.

Причина этого: согласно http://www.php.net/manual/en/context.ssl.php, verify_peer по умолчанию false.

allow_self_signed ТРЕБУЕТСЯ verify_peer и по умолчанию false.

Из вышеизложенного я понимаю, что allow_self_signed, вероятно, переопределяет вашу настройку для verify_peer.

Итак, попробуйте без опции для SSL или без allow_self_signed, и сообщите нам, помогло ли это кому-либо.

Ответ 3

Вы можете попробовать отладить это с помощью Wireshark - вы можете получить лучшее представление о том, что пойдет не так, вы должны увидеть, какой SSL возникает ошибка.

Ответ 4

установите только этот

yum install ca-certificates.noarch