it-swarm.com.ru

file_get_contents игнорируя verify_peer => false?

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

Я протестировал несколько установок PHP, все на v5.3.3, 32 бита, Debian 32 бита.

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

При использовании 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? Есть идеи, как отладить?

12
Tiberiu-Ionuț Stan

Вы пропустили 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));
3
Skeets

не знаю, поможет ли это на самом деле, но попробуйте удалить параметры 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, и дайте нам знать, если это помогло.

1
Nick Andriopoulos

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

$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 формы в противном случае из конфигурации сервера.

0
Mohamad Rostami

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

0
JackTheRandom