5 Pertanyaan: file_get_contents mengabaikan verifikasi_peer => salah?

pertanyaan dibuat di Thu, Feb 28, 2013 12:00 AM

file_get_contents dengan host https berfungsi dengan baik, kecuali untuk host tertentu (uji coba server dari beberapa perusahaan - ip masuk daftar putih, tidak dapat memberi Anda URL untuk diuji). Aturan ini tidak memuat modul https dan kesalahan pengaturan awal lainnya.

Saya telah menguji dengan beberapa instalasi PHP, semuanya pada v5.3.3, 32bits, Debian 32bits.

Permintaan berfungsi dengan cURL, tetapi hanya jika pengaturan curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);. Namun, pengaturan verify_peer"=>false pada konteks untuk file_get_contents tampaknya tidak membuat perbedaan.

Dengan file_get_contents, permintaan yang sama persis (URL yang sama, data POST XML yang sama) gagal dengan SSL: Koneksi diatur ulang oleh rekan :

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

.

Adakah yang menemukan ini dengan file_get_contents? Ada gagasan bagaimana cara debug?

    
12
  1. Apakah Anda mencoba mengatur allow_self_signed ke false?
    2013-02-25 21: 33: 32Z
  2. Baru saja mencobanya, kesalahan yang sama.
    2013-02-25 21: 37: 15Z
  3. Mengapa tidak menggunakan cURL saja?
    2013-02-25 21: 38: 49Z
  4. Ya, cURL tampaknya merupakan taruhan terbaik. Beberapa pencarian Google menunjukkan kepada saya bahwa orang lain memiliki masalah yang sama tanpa bisa menyelesaikannya. Mereka semua kembali menggunakan CURL.
    2013-02-25 21: 39: 44Z
  5. Sangat terlambat untuk pertanyaan ini, tetapi Anda juga dapat mencoba 'verify_peer_name'=>false
    2015-08-16 08: 36: 18Z
5 Jawaban                              5                         

Anda ketinggalan verify_peer_name. Jika Anda menyetelnya ke false juga, permintaan berfungsi:

 
$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));
    
4
2018-08-16 23: 17: 16Z

tidak tahu apakah ini benar-benar akan membantu, tetapi cobalah menghapus SSL opsi dari array opsi Anda.

Alasan di balik ini: menurut http://www.php.net/manual/en/context.ssl .php , secara default verify_peer adalah false.

allow_self_signed MEMBUTUHKAN verify_peer, dan secara default false.

Dari yang di atas, saya tahu bahwa allow_self_signed mungkin mengesampingkan pengaturan Anda untuk verify_peer.

Jadi silakan coba tanpa opsi apa pun untuk SSL, atau tanpa allow_self_signed, dan beri tahu kami jika itu membantu.

    
1
2013-03-07 06: 55: 41Z

Anda dapat mencoba men-debug ini dengan Wireshark - Anda mungkin mendapatkan ide yang lebih baik tentang kesalahan, Anda harus melihat kesalahan SSL mana yang terjadi.

    
0
2013-03-03 01: 28: 42Z
  1. Server SSL melaporkan kesalahan SSL sebelum menutup telepon?
    2013-03-03 11: 13: 50Z
  2. Anda mendapatkan "Koneksi diatur ulang oleh rekan", yang berarti itu tidak ditutup secara otomatis. Saya menduga jika klien dan server tidak dapat menyetujui versi handshake SSL mana yang akan digunakan, Anda akan mendapatkan kesalahan ini.
    2013-03-03 12: 53: 44Z

coba kode ini:

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

jika Anda tidak mendapatkan kesalahan, saya pikir masalah (dengan file_get_contents) adalah bentuk konfigurasi php klien selain dari konfigurasi server.

    
0
2013-03-08 08: 28: 00Z
  1. Ok, fsockopen bekerja. Namun, tidak ada yang salah dengan konfigurasi PHP. Ini berfungsi dengan baik dengan banyak sertifikat SSL lain yang ditandatangani sendiri oleh HTTPS.
    2013-03-07 20: 45: 35Z

hanya instal ini

 
yum install ca-certificates.noarch
    
- 1
2016-07-31 13: 34: 18Z
  1. Sementara cuplikan kode ini dapat menyelesaikan pertanyaan, termasuk penjelasan sangat membantu meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, dan orang-orang itu mungkin tidak tahu alasan untuk saran kode Anda. Harap juga mencoba untuk tidak membuat kerumunan kode Anda dengan komentar penjelasan, karena ini mengurangi keterbacaan kode dan penjelasan!
    2016-07-31 19: 19: 18Z
sumber ditempatkan sini
Pertanyaan Lain