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);
}
James Simpson
sumber

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) {
  [...]
}
VolkerK
sumber
@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
hassan
sumber
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.

Benjamin Crouzier
sumber
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

Dushyant Dagar
sumber
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.

Emil Vikström
sumber
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.

Ritesh Chandora
sumber
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.

Jim Jones
sumber
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.

Gordon
sumber
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.

dtbarne.dll
sumber
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.

GZipp
sumber
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!

Teson
sumber
-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);
}
Orang biasa
sumber