Dari PHP, Anda dapat mengakses Perpustakaan cURL [libcurl] yang berguna untuk membuat permintaan ke URL menggunakan berbagai protokol seperti HTTP, FTP, LDAP, dan bahkan Gopher. [Jika Anda menghabiskan waktu di baris perintah *nix, sebagian besar lingkungan juga memiliki perintah curl
yang menggunakan pustaka libcurl]
Namun dalam praktiknya, protokol yang paling umum digunakan cenderung HTTP, terutama saat menggunakan PHP untuk komunikasi server-ke-server. Biasanya ini melibatkan mengakses server web lain sebagai bagian dari panggilan layanan web, menggunakan beberapa metode seperti XML-RPC atau REST untuk menanyakan sumber daya. Misalnya, Delicious menawarkan API berbasis HTTP untuk memanipulasi dan membaca postingan pengguna. Namun, ketika mencoba mengakses sumber daya HTTPS [seperti API yang enak], ada sedikit konfigurasi yang harus Anda lakukan sebelum Anda dapat membuat cURL berfungsi dengan benar di PHP
Masalah
Jika Anda hanya mencoba mengakses HTTPS [SSL atau sumber daya yang dilindungi TLS] di PHP menggunakan cURL, kemungkinan besar Anda akan mengalami beberapa kesulitan. Katakanlah Anda memiliki kode berikut. [Penanganan kesalahan dihilangkan untuk singkatnya]
// Initialize session and set URL.
$ch = curl_init[];
curl_setopt[$ch, CURLOPT_URL, $url];
// Set so curl_exec returns the result instead of outputting it.
curl_setopt[$ch, CURLOPT_RETURNTRANSFER, true];
// Get the response and close the channel.
$response = curl_exec[$ch];
curl_close[$ch];
Jika $url
_ mengarah ke sumber daya HTTPS, kemungkinan besar Anda akan menemui kesalahan seperti di bawah ini
Failed: Error Number: 60. Reason: SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
_Masalahnya adalah cURL belum dikonfigurasi untuk mempercayai sertifikat HTTPS server. Konsep sertifikat dan PKI berkisar pada kepercayaan Otoritas Sertifikat [CA], dan secara default, cURL diatur untuk tidak mempercayai CA mana pun, sehingga tidak akan mempercayai sertifikat server web mana pun. Jadi mengapa Anda tidak mengalami masalah saat mengunjungi situs HTTP melalui browser web Anda?
Perbaikan cepat
Ada dua cara untuk mengatasi masalah ini. Pertama, kita cukup mengonfigurasi cURL untuk menerima sertifikat server [peer] apa pun. Ini tidak optimal dari sudut pandang keamanan, tetapi jika Anda tidak menyampaikan informasi sensitif bolak-balik, ini mungkin baik-baik saja. Cukup tambahkan baris berikut sebelum memanggil curl_exec[]
curl_setopt[$ch, CURLOPT_SSL_VERIFYPEER, false];
Ini pada dasarnya menyebabkan cURL menerima sertifikat server apa pun secara membabi buta, tanpa melakukan verifikasi apa pun tentang CA mana yang menandatanganinya, dan apakah CA itu dipercaya atau tidak. Jika Anda benar-benar khawatir tentang data yang Anda berikan atau terima dari server, Anda harus mengaktifkan verifikasi rekan ini dengan benar. Melakukannya sedikit lebih rumit
Perbaikan yang tepat
Perbaikan yang tepat melibatkan pengaturan parameter CURLOPT_CAINFO
. Ini digunakan untuk menunjuk ke sertifikat CA yang harus dipercaya oleh cURL. Dengan demikian, setiap sertifikat server/peer yang dikeluarkan oleh CA ini juga akan dipercaya. Untuk melakukan ini, pertama-tama kita perlu mendapatkan sertifikat CA. Dalam contoh ini, saya akan menggunakan https. //api. del. ini. kami/server sebagai referensi
Pertama, Anda harus mengunjungi URL dengan browser web untuk mendapatkan sertifikat CA. Kemudian, [di Firefox] buka detail keamanan situs dengan mengklik dua kali ikon gembok di pojok kanan bawah
Kemudian klik "Lihat Sertifikat"
Buka tab "Detail" pada halaman sertifikat, dan pilih sertifikat di bagian atas hierarki. Ini adalah sertifikat CA
Kemudian klik "Ekspor", dan simpan sertifikat CA ke lokasi yang Anda pilih, pastikan untuk memilih X. 509 Certificate [PEM] sebagai jenis/format penyimpanan
Sekarang kita perlu memodifikasi pengaturan cURL untuk menggunakan sertifikat CA ini, dengan CURLOPT_CAINFO
diatur ke titik tempat kita menyimpan file sertifikat CA
curl_setopt[$ch, CURLOPT_SSL_VERIFYPEER, true];
curl_setopt[$ch, CURLOPT_SSL_VERIFYHOST, 2];
curl_setopt[$ch, CURLOPT_CAINFO, getcwd[] . "/CAcerts/BuiltinObjectToken-EquifaxSecureCA.crt"];
Opsi lain yang saya sertakan, CURLOPT_SSL_VERIFYHOST
dapat diatur ke nilai bilangan bulat berikut
- 0. Jangan centang atribut nama umum [CN].
- 1. Periksa apakah atribut nama umum setidaknya ada
- 2. Periksa apakah nama umum ada dan cocok dengan nama host server
Jika Anda memiliki
Failed: Error Number: 60. Reason: SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
0 disetel ke false, maka dari sudut pandang keamanan, tidak masalah apa yang Anda setel CURLOPT_SSL_VERIFYHOST
ke, karena tanpa verifikasi sertifikat rekan, server dapat menggunakan sertifikat apa pun, termasuk yang ditandatangani sendiri yang dijamin untuk memiliki CN yang cocok dengan nama host server. Jadi pengaturan ini benar-benar hanya relevan jika Anda telah mengaktifkan verifikasi sertifikatIni memastikan bahwa tidak sembarang sertifikat server akan dipercaya oleh sesi cURL Anda. Misalnya, jika penyerang entah bagaimana mengalihkan lalu lintas dari api. lezat. com ke server mereka sendiri, sesi cURL di sini tidak akan diinisialisasi dengan benar, karena penyerang tidak akan memiliki akses ke sertifikat server [i. e. tidak akan memiliki kunci privat] yang dipercaya oleh CA yang kami tambahkan. Langkah-langkah ini secara efektif mengekspor CA tepercaya dari browser web ke konfigurasi cURL
Informasi lebih lanjut
Jika Anda memiliki sertifikat CA, tetapi tidak dalam format PEM [mis. e. itu dalam format biner atau DER yang tidak disandikan Base64], Anda harus menggunakan sesuatu seperti OpenSSL untuk mengubahnya menjadi format PEM. Perintah persisnya berbeda tergantung pada apakah Anda mengonversi dari format PKCS12 atau DER
Ada opsi
Failed: Error Number: 60. Reason: SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
_2 yang memungkinkan Anda menentukan direktori yang menyimpan beberapa sertifikat CA untuk dipercaya. Tapi itu tidak sesederhana membuang setiap sertifikat CA di direktori ini. Sebagai gantinya, sertifikat CA mereka harus diberi nama dengan benar, dan utilitas OpenSSL Failed: Error Number: 60. Reason: SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
3 dapat digunakan untuk mengatur direktori ini dengan benar untuk digunakan oleh cURL