Bagaimana cara membuat file_get_contents () bekerja dengan HTTPS?


106

Saya sedang menyiapkan pemrosesan kartu kredit dan perlu menggunakan solusi untuk CURL. Kode berikut berfungsi dengan baik ketika saya menggunakan server pengujian (yang tidak memanggil URL SSL), tetapi sekarang ketika saya mengujinya di server yang berfungsi dengan HTTPS, gagal dengan pesan kesalahan "gagal membuka aliran".

function send($packet, $url) {
  $ctx = stream_context_create(
    array(
      'http'=>array(
        'header'=>"Content-type: application/x-www-form-urlencoded",
        'method'=>'POST',
        'content'=>$packet
      )
    )
  );
  return file_get_contents($url, 0, $ctx);
}

Jawaban:


89

Coba skrip berikut untuk melihat apakah ada pembungkus https yang tersedia untuk skrip php Anda.

$w = stream_get_wrappers();
echo 'openssl: ',  extension_loaded  ('openssl') ? 'yes':'no', "\n";
echo 'http wrapper: ', in_array('http', $w) ? 'yes':'no', "\n";
echo 'https wrapper: ', in_array('https', $w) ? 'yes':'no', "\n";
echo 'wrappers: ', var_export($w);

outputnya harus seperti ini

openssl: yes
http wrapper: yes
https wrapper: yes
wrappers: array(11) {
  [...]
}

@volker Itu sebabnya saya meminta allow_url_fopen
Gordon

Nah yang aneh adalah ia mengatakan openssl tidak aktif, tetapi menurut phpinfo () itu dikompilasi dengan itu, kecuali saya melihatnya salah.
James Simpson

phpinfo () memberitahu Anda demikian di baris-konfigurasi atau apakah ada keseluruhan bagian yang disebut "OpenSSL"?
VolkerK

Oke itu hanya di baris-konfigurasi, bukan bagian untuk itu. Saya kira itu masalahnya?
James Simpson

Saya memiliki semua itu dan masih tidak berhasil. Dan allow_url_fopen. Hanya url non https yang bekerja dari localhost.
Curtis

116

Untuk mengizinkan https pembungkus:

  • yang php_opensslekstensi harus ada dan diaktifkan
  • allow_url_fopen harus disetel ke on

Di file php.ini Anda harus menambahkan baris ini jika tidak ada:

extension=php_openssl.dll

allow_url_fopen = On

Keduanya disetel ke Aktif dalam penginstalan saya tetapi saya masih mendapatkan kesalahan SSL "Peringatan: file_get_contents (): SSL: Handshake timed in"
Adamantus

53

Coba berikut ini.

function getSslPage($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_REFERER, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

Catatan: Ini menonaktifkan verifikasi SSL, artinya keamanan yang ditawarkan oleh HTTPS hilang . Hanya gunakan kode ini untuk pengujian / pengembangan lokal, jangan pernah di internet atau jaringan publik lainnya. Jika kode ini berfungsi, artinya sertifikat SSL tidak tepercaya atau tidak dapat diverifikasi, yang harus Anda perbaiki sebagai masalah terpisah.


29
Mengapa Anda menonaktifkan verifikasi ssl saat berurusan dengan pemrosesan kartu kredit?
Peter

Terima kasih, triknya ada di sini: curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, FALSE);
Dylan B

46
$url= 'https://example.com';

$arrContextOptions=array(
      "ssl"=>array(
            "verify_peer"=>false,
            "verify_peer_name"=>false,
        ),
    );  

$response = file_get_contents($url, false, stream_context_create($arrContextOptions));

Ini akan memungkinkan Anda untuk mendapatkan konten dari url apakah itu HTTPS


Terima kasih! Ini berhasil di pihak saya. Telah mencoba untuk memanggil FB Open Graph API :)
decodingpanda

Saya mencoba mengakses domain saya dengan sertifikat yang tidak valid hanya untuk tujuan pengujian dan meskipun ini menonaktifkan validasi SSL, itulah yang saya butuhkan.
carla

Bagus! Saya telah mencoba selama 5 hari untuk mengunduh kalender airbnb di situs uji XAMPP saya menggunakan file_get_contents, ini menyelesaikan masalah, terima kasih.
JohnnyBeGood

Berhasil untuk saya mencoba menyambung ke kotak pengujian Vagrant tanpa sertifikat HTTP yang valid melalui https. Tautan ke opsi Konteks SSL PHP diatur di sini: php.net/manual/en/context.ssl.php ; verifikasi peer = Wajibkan verifikasi sertifikat SSL yang digunakan; verifikasi_peer_name = Wajibkan verifikasi nama rekan.
Anthony

Bukankah ini melanggar sertifikasi SSL dan merupakan lubang keamanan?
webchun

10

Ini mungkin karena server target Anda tidak memiliki sertifikat SSL yang valid.


Server yang meminta tidak perlu memiliki sertifikat SSL.
ceejayoz

15
Saya tidak mengatakan server yang meminta, saya mengatakan server target.
Emil Vikström

2
Itu akan mengajari saya untuk membaca sepintas. Heh! Mohon terima permintaan maaf dan dukungan saya.
ceejayoz

Server target memang memiliki sertifikat SSL yang valid.
James Simpson

@James, apakah Anda mendapatkan kesalahan jika Anda mencoba menghubungkan dengan cURL? Atau apakah itu sama sekali tidak mungkin untuk dicoba?
Emil Vikström

6

Cukup tambahkan dua baris di file php.ini Anda.

extension=php_openssl.dll

allow_url_include = On

itu bekerja untuk saya.


1
Anda mungkin bermaksud allow_url_fopenkarena pertanyaan menyangkut pembukaan url, tidak termasuk.
shukshin.ivan

5

Saya mengalami kesalahan yang sama. Pengaturan allow_url_include = Ondi php.iniperbaiki untuk saya.


5

HTTPS didukung mulai dari PHP 4.3.0, jika Anda telah mengumpulkan dukungan untuk OpenSSL. Selain itu, pastikan server target memiliki sertifikat yang valid, firewall mengizinkan koneksi keluar dan allow_url_fopendi php.ini disetel ke true.


Saya memiliki PHP 5.2.8 dengan dukungan OpenSSL. Saya mendapatkan kesalahan yang sama dengan ini, dan server target memiliki sertifikat yang valid.
James Simpson

2
apakah firewall dikonfigurasi untuk mengizinkan koneksi https keluar? Biasanya, server web yang menjalankan https tidak berjalan pada port 80. apakah ada kesalahan lain selain 'gagal membuka aliran'?
Gordon

1
Sejauh yang saya tahu, ini adalah keseluruhan kesalahan: Peringatan: fopen (https: // ...) [function.fopen]: gagal membuka aliran: Tidak ada file atau direktori seperti itu di / home / user / public_html / test.php di jalur 993
James Simpson

dan allow_url_fopen di php.ini diatur ke apa?
Gordon

Itu aneh. Dapatkah Anda melakukan GET pada HTTP dan url HTTPS untuk melihat apakah itu berfungsi? tanpa konteks aliran?
Gordon

3

Dalam kasus saya, masalahnya adalah karena WAMP menggunakan php.ini yang berbeda untuk CLI dari Apache, jadi pengaturan yang Anda buat melalui menu WAMP tidak berlaku untuk CLI. Cukup modifikasi CLI php.ini dan berhasil.


1

Terkadang server akan memilih untuk tidak merespons berdasarkan apa yang dilihat atau tidak dilihatnya di header permintaan http (seperti agen pengguna yang sesuai). Jika Anda dapat terhubung dengan browser, ambil header yang dikirim dan tiru mereka dalam konteks streaming Anda.


0

Saya terjebak dengan https non fungsional di IIS. Diselesaikan dengan:

file_get_contents ('https ..) tidak mau dimuat.

  • unduh https://curl.haxx.se/docs/caextract.html
  • instal di bawah ..phpN.N / extras / ssl
  • edit php.ini dengan:

    curl.cainfo = "C: \ Program Files \ PHP \ v7.3 \ extras \ ssl \ cacert.pem" openssl.cafile = "C: \ Program Files \ PHP \ v7.3 \ extras \ ssl \ cacert.pem"

akhirnya!


-1

UNTUK MEMERIKSA APAKAH URL ATAS ATAU TIDAK

Kode dalam pertanyaan Anda dapat ditulis ulang menjadi versi yang berfungsi:

function send($packet=NULL, $url) {
// Do whatever you wanted to do with $packet
// The below two lines of code will let you know if https url is up or not
$command = 'curl -k '.$url;
return exec($command, $output, $retValue);
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.