Saya sudah mencoba mengakses layanan REST khusus ini dari halaman PHP yang saya buat di server kami. Saya mempersempit masalahnya menjadi dua baris ini. Jadi halaman PHP saya terlihat seperti ini:
<?php
$response = file_get_contents("https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json");
echo $response; ?>
Halaman mati pada baris 2 dengan kesalahan berikut:
- Peringatan: file_get_contents (): Operasi SSL gagal dengan kode 1. Pesan kesalahan OpenSSL: kesalahan: 14090086: rutinitas SSL: SSL3_GET_SERVER_CERTIFICATE: verifikasi sertifikat gagal di ... php on line 2
- Peringatan: file_get_contents (): Gagal mengaktifkan crypto di ... php on line 2
- Peringatan: file_get_contents (
https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json
): gagal membuka aliran: operasi gagal di ... php on line 2
Kami menggunakan server Gentoo. Kami baru-baru ini ditingkatkan ke PHP versi 5.6. Itu setelah pemutakhiran ketika masalah ini muncul.
Saya menemukan ketika saya mengganti layanan REST dengan alamat seperti https://www.google.com
; halaman saya berfungsi dengan baik.
Dalam upaya sebelumnya saya menetapkan “verify_peer”=>false
, dan meneruskannya sebagai argumen ke file_get_contents, seperti yang dijelaskan di sini: file_get_contents mengabaikan Verify_peer => false? Tapi seperti yang dicatat penulis; tidak ada bedanya.
Saya telah bertanya kepada salah satu administrator server kami apakah baris-baris ini dalam file php.ini kami ada:
- extension = php_openssl.dll
- allow_url_fopen = Hidup
Dia memberi tahu saya bahwa karena kita menggunakan Gentoo, openssl dikompilasi ketika kita membangun; dan itu tidak diatur dalam file php.ini.
Saya juga mengkonfirmasi bahwa allow_url_fopen
itu berfungsi. Karena sifat khusus masalah ini; Saya tidak menemukan banyak informasi untuk bantuan. Apakah ada di antara Anda yang menemukan sesuatu seperti ini? Terima kasih.
Jawaban:
Ini adalah tautan yang sangat bermanfaat untuk ditemukan:
http://php.net/manual/en/migration56.openssl.php
Dokumen resmi yang menjelaskan perubahan yang dibuat untuk membuka ssl di PHP 5.6 Dari sini saya mempelajari satu parameter lagi yang seharusnya saya atur menjadi false: "memverifikasi_peer_name" => false
Jadi kode kerja saya terlihat seperti ini:
sumber
file_get_contents($url, false, stream_context_create(array('ssl' => array('verify_peer' => false, 'verify_peer_name' => false))));
Anda tidak seharusnya mematikan verifikasi saja. Alih-alih Anda harus mengunduh bundel sertifikat, mungkin bundel ikal akan melakukannya?
Maka Anda hanya perlu meletakkannya di server web Anda, memberikan pengguna yang menjalankan izin php untuk membaca file. Maka kode ini akan bekerja untuk Anda:
Mudah-mudahan, sertifikat root dari situs yang Anda coba akses ada di bundel ikal. Jika tidak, ini masih tidak akan berfungsi sampai Anda mendapatkan sertifikat root dari situs dan memasukkannya ke file sertifikat Anda.
sumber
stream_context_set_default
yang dapat digunakan sehingga Anda tidak harus meneruskannya ke file_get_contents setiap kaliSaya memperbaiki ini dengan memastikan bahwa OpenSSL telah diinstal pada mesin saya dan kemudian menambahkan ini ke php.ini saya:
sumber
cert.pem
file dan mengatur yangphp.ini
seperti ini, dan itu berhasil:openssl.cafile=D:\Tools\GnuWin32\bin\cacert.pem
Anda dapat mengatasi masalah ini dengan menulis fungsi kustom yang menggunakan curl, seperti pada:
Maka gunakan saja
file_get_contents_curl
alih-alihfile_get_contents
setiap kali Anda memanggil url yang dimulai dengan https.sumber
Bekerja untuk saya, saya menggunakan PHP 5.6. ekstensi openssl harus diaktifkan dan saat memanggil google map api verifikasi_peer buat false.
sumber
Jika versi PHP Anda 5, coba instal cURL dengan mengetik perintah berikut di terminal:
sumber
cURL
.sudo port install php70-curl
Pada dasarnya Anda harus mengatur variabel lingkungan SSL_CERT_FILE ke jalur file PEM sertifikat ssl yang diunduh dari tautan berikut: http://curl.haxx.se/ca/cacert.pem .
Butuh banyak waktu untuk memikirkan hal ini.
sumber
mengikuti langkah-langkah di bawah ini akan memperbaiki masalah ini,
curl.cainfo
dan tempelkan path absolut tempat Anda mengunduh Sertifikat.curl.cainfo ="C:\wamp\htdocs\cert\cacert.pem"
berharap itu bisa membantu !!
sumber
Hanya ingin menambahkan ini karena saya mengalami masalah yang sama dan tidak ada yang bisa saya temukan di mana saja akan berfungsi (misalnya mengunduh file cacert.pem, mengatur cafile di php.ini dll.)
Jika Anda menggunakan NGINX dan sertifikat SSL Anda dilengkapi dengan "sertifikat perantara", Anda harus menggabungkan file sertifikat perantara dengan file "mydomain.com.crt" utama Anda dan harus berfungsi. Apache memiliki pengaturan khusus untuk sertifikat perantara, tetapi NGINX tidak melakukannya sehingga harus berada dalam file yang sama dengan sertifikat biasa Anda.
sumber
Alasan untuk kesalahan ini adalah PHP tidak memiliki daftar otoritas sertifikat tepercaya.
PHP 5.6 dan yang lebih baru mencoba memuat CA yang dipercaya oleh sistem secara otomatis. Masalah dengan itu bisa diperbaiki. Lihat http://php.net/manual/en/migration56.openssl.php untuk informasi lebih lanjut.
PHP 5.5 dan sebelumnya benar - benar sulit untuk dipasang dengan benar karena Anda secara manual harus menentukan bundel CA di setiap konteks permintaan, hal yang tidak ingin Anda taburkan di sekitar kode Anda. Jadi saya memutuskan untuk kode saya bahwa untuk versi PHP <5.6, verifikasi SSL hanya dinonaktifkan:
sumber
Mengalami kesalahan yang sama dengan PHP 7 pada XAMPP dan OSX.
Jawaban yang disebutkan di atas dalam https://stackoverflow.com/ baik, tetapi tidak sepenuhnya menyelesaikan masalah bagi saya. Saya harus memberikan rantai sertifikat lengkap untuk membuat file_get_contents () berfungsi lagi. Begitulah cara saya melakukannya:
Dapatkan sertifikat root / perantara
Pertama-tama saya harus mencari tahu apa akarnya dan sertifikat perantara.
Cara paling nyaman adalah mungkin alat sertifikat online seperti ssl-shopper
Di sana saya menemukan tiga sertifikat, satu sertifikat server dan dua sertifikat berantai (satu adalah root, yang lain tampaknya perantara).
Yang perlu saya lakukan hanyalah mencari internet untuk mereka berdua. Dalam kasus saya, ini adalah root:
thawte DV SSL SHA256 CA
Dan itu mengarah ke url thawte.com-nya . Jadi saya hanya memasukkan sertifikat ini ke dalam file teks dan melakukan hal yang sama untuk perantara. Selesai
Dapatkan sertifikat host
Hal berikutnya yang harus saya lakukan adalah mengunduh cert server saya. Di Linux atau OS X dapat dilakukan dengan openssl:
Sekarang kumpulkan mereka semua
Sekarang gabungkan semuanya menjadi satu file. (Mungkin ada baiknya untuk menempatkannya dalam satu folder, saya hanya menggabungkannya menjadi satu file). Anda dapat melakukannya seperti ini:
beri tahu PHP di mana menemukan rantai
Ada fungsi praktis ini openssl_get_cert_locations () yang akan memberi tahu Anda, tempat PHP mencari file cert. Dan ada parameter ini, yang akan memberi tahu file_get_contents () di mana harus mencari file cert. Mungkin kedua cara itu akan berhasil. Saya lebih suka cara parameter. (Dibandingkan dengan solusi yang disebutkan di atas).
Jadi sekarang ini adalah PHP-Code saya
Itu saja. file_get_contents () berfungsi kembali. Tanpa CURL dan mudah-mudahan tanpa cacat keamanan.
sumber
chain.pem
? Apakah inichain.crt
?Setelah menjadi korban masalah ini pada centOS setelah memperbarui php ke php5.6 saya menemukan solusi yang bekerja untuk saya.
Dapatkan direktori yang benar untuk sertifikat Anda untuk ditempatkan secara default dengan ini
Kemudian gunakan ini untuk mendapatkan sertifikat dan meletakkannya di lokasi default yang ditemukan dari kode di atas
sumber
Memiliki masalah ssl yang sama pada mesin pengembang saya (php 7, xampp pada windows) dengan sertifikat yang ditandatangani sendiri mencoba membuka " https: // localhost / ..." - file. Jelas rakitan-sertifikat-root (cacert.pem) tidak berfungsi. Saya baru saja menyalin kode secara manual dari apache server.crt-File di cacert.pem yang diunduh dan melakukan entri openssl.cafile = path / to / cacert.pem di php.ini
sumber
Hal lain yang harus dicoba adalah menginstal ulang
ca-certificates
seperti yang dijelaskan di sini .Dan hal lain yang harus dicoba adalah secara eksplisit mengizinkan sertifikat satu situs yang dimaksud seperti yang dijelaskan di sini (terutama jika satu situs adalah server Anda sendiri dan Anda sudah memiliki .pem dalam jangkauan).
Saya mengalami kesalahan SO yang tepat ini setelah memutakhirkan ke PHP 5.6 pada CentOS 6 mencoba mengakses server itu sendiri yang memiliki sertifikat keamanan keselamatan yang lebih rendah yang mungkin perlu diperbarui, tetapi sebaliknya saya menginstal sertifikat allowencrypt dan dengan dua langkah di atas itu melakukannya Trik-nya. Saya tidak tahu mengapa langkah kedua diperlukan.
Perintah yang Berguna
Lihat versi openssl:
Lihat pengaturan PHP cli ssl saat ini:
sumber
Mengenai kesalahan mirip dengan
Sudahkah Anda memeriksa izin sertifikat dan direktori yang dirujuk oleh openssl?
Kamu bisa melakukan ini
Untuk mendapatkan sesuatu yang mirip dengan ini
Masalah ini membuat saya frustrasi untuk sementara waktu, sampai saya menyadari bahwa folder "sertifikat" saya memiliki 700 izin, padahal seharusnya 755 izin. Ingat, ini bukan folder untuk kunci tetapi sertifikat. Saya sarankan membaca tautan ini pada izin ssl.
Pernah saya lakukan
Masalahnya sudah diperbaiki, setidaknya untuk saya.
sumber
Saya memiliki masalah yang sama untuk halaman aman lain saat menggunakan
wget
ataufile_get_contents
. Banyak penelitian (termasuk beberapa tanggapan pada pertanyaan ini) menghasilkan solusi sederhana - menginstal Curl dan PHP-Curl - Jika saya mengerti dengan benar, Curl memiliki Root CA untuk Comodo yang menyelesaikan masalahInstal Curl dan addon PHP-Curl, kemudian restart Apache
Semua sudah berfungsi.
sumber