Sejak PHP versi 5.6 autentikasi SSL terhadap akses cURL (CURLOPT_SSL_VERIFYPEER
) default menjadi TRUE
. Hal ini mengakibatkan ketika menggunakan fungsi file_get_contents()
selalu melakukan validasi sertifikat SSL terhadap URL tujuan yang menggunakan protokol SSL. Meskipun URL tujuan telah terinstall sertifikat SSL yang valid, namun cURL tidak dapat membuktikan validitas SSL jika belum memiliki dokumen pembanding sendiri (CA certs list).
Hari ini kebetulan saya juga mengalami masalah yang sama, ketika memasang webuzo di server yang baru. Tidak lama setelah konfigurasi telah selesai dilakukan saya baru sadar kalau beberapa fungsionalitas website tidak bekerja seperti biasanya. Setelah memeriksa berkas log
saya mendapati pesan warning sebagai berikut:
PHP Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /home/user/public_html/script.php on line 1 PHP Warning: file_get_contents(): Failed to enable crypto in/home/user/public_html/script.php on line 1 PHP Warning: file_get_contents(https://domain.com/index.html): failed to open stream: operation failed in/home/user/public_html/script.php on line 1
Padahal saya bisa pastikan sertifikat SSL digunakan URL tujuan memang benar-benar valid. Setelah melakukan pencarian beberapa orang lebih suka menyarankan untuk men-disable validasi SSL ketika melakukan request, namun ternyata hal tersebut cukup berbahaya.
Akhirnya saya menemukan sumber yang menyarankan untuk menambahkan sertifikat CA dari website resmi cURL untuk dikonfigurasi dengan PHP. Caranya adalah dengan men-download certs-yyyy-mm-dd.pem
ke server, buka php.ini
dan tambahkan konfigurasi berikut:
openssl.cafile=/path/to/certs/cacert-yyyy-mm-dd.pem
Kemudian restart apache
, jika berhasil seharusnya di phpinfo()
akan muncul sertifikat SSL akan muncul di konfigurasi openssl
PHP.