Php curl dengan sertifikat ssl

Perilaku fungsi-fungsi ini dipengaruhi oleh pengaturan di php. ini

Opsi Konfigurasi cURLNameDefaultChangeableChangelogNULLPHP_INI_SYSTEMUntuk perincian lebih lanjut dan definisi mode PHP_INI_*, lihat Di mana pengaturan konfigurasi dapat diatur

Berikut penjelasan singkat tentang direktif konfigurasi

curl.cainfo string

Nilai default untuk opsi CURLOPT_CAINFO. Ini diperlukan untuk menjadi jalur absolut

I was editing wrong php.ini file in last comment._

Even though loaded configuration path was showing as "D:\wamp64\bin\apache\apache2.4.37\bin\php.ini" inside phpinfo() of WAMP Server, It was actually loading "D:\wamp64\bin\apache\apache2.4.37\bin\phpForApache.ini"

Once I set both the variables inside phpForApache.ini, details are displayed in phpinfo() and error has gone without extra coding line.

cURL error 60: SSL certificate problem: unable to get local issuer certificate

This local development error comes when curl.cainfo variable is not set correctly.

I faced this issue in PHP Version 7.3.1

In order to fix the error, I downloaded cacert.pem from https://curl.haxx.se/docs/caextract.html

Set the following paths in php.ini

curl.cainfo="D:\wamp64\bin\php\php7.3.1\extras\ssl\cacert.pem"
openssl.cafile="D:\wamp64\bin\php\php7.3.1\extras\ssl\cacert.pem"

Even after adding the paths and restart Apache, Inside phpinfo(), both the paths were showing blank.

The error will go only if we set via php code of the project.

Example code worked for me :-

$guzzle = new \GuzzleHttp\Client(['verify' => 'D:\wamp64\bin\php\php7.3.1\extras\ssl\cacert.pem']);

cURL error 60: SSL certificate problem: unable to get local issuer certificate

This problem can occur when developing locally on windows. I am using windows 10 (x64)

In order to fix the error, I downloaded cacert.pem from https://curl.haxx.se/docs/caextract.html

Set the following value for in php.ini

curl.cainfo = "C: \ php-8.0.7 \ extras \ ssl \ cacert.pem"

As of PHP 7.2 (Win 64) this directive, will NOT show in the phpinfo() even though it's set.

CURLOPT_CAINFO_0

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 tersedia 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 (sumber daya yang dilindungi SSL atau 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 sebaiknya 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. us/ server sebagai referensi

Pertama, Anda harus mengunjungi URL dengan browser web Anda untuk mendapatkan sertifikat CA. Kemudian, (di Firefox) buka detail keamanan situs dengan mengklik dua kali ikon gembok di pojok kanan bawah

Php curl dengan sertifikat ssl

Kemudian klik "Lihat Sertifikat"

Php curl dengan sertifikat ssl

Buka tab "Detail" di halaman sertifikat, dan pilih sertifikat di bagian atas hierarki. Ini adalah sertifikat CA

Php curl dengan sertifikat ssl

Kemudian klik "Ekspor", dan simpan sertifikat CA ke lokasi yang Anda pilih, pastikan untuk memilih X. 509 Certificate (PEM) sebagai jenis/format penyimpanan

Php curl dengan sertifikat ssl

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

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 telah Anda setel CURLOPT_SSL_VERIFYHOST ke, karena tanpa verifikasi sertifikat peer, server dapat menggunakan sertifikat apa pun, termasuk sertifikat yang ditandatangani sendiri yang dijamin . Jadi pengaturan ini benar-benar hanya relevan jika Anda telah mengaktifkan verifikasi sertifikat

Ini 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 dikodekan Base64), Anda harus menggunakan sesuatu seperti OpenSSL untuk mengonversinya ke 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

Bagaimana cara menggunakan sertifikat SSL di curl PHP?

Mengikuti langkah-langkah ini akan membantu Anda. .
Unduh dan simpan sertifikat yang ditandatangani sendiri
Beri tahu klien Curl tentang hal itu dengan saklar baris perintah --cacert [file]. Parameter ini memberi tahu Curl untuk menggunakan file sertifikat yang ditentukan untuk memverifikasi peer. [File] boleh berisi beberapa sertifikat CA dan harus dalam format PEM

Apakah curl memeriksa sertifikat SSL?

curl melakukan validasi sertifikat peer SSL secara default . Ini dilakukan dengan menggunakan penyimpanan sertifikat yang dapat digunakan pustaka SSL untuk memastikan sertifikat server peer valid.

Apakah curl mendukung SSL?

Curl memiliki dukungan bawaan untuk koneksi Transport Aman (versi yang lebih aman disebut TLS). Saat Anda membuat permintaan Curl untuk URL HTTPS, Curl secara otomatis memeriksa sertifikat SSL URL target terhadap penyimpanan sertifikat CA lokal dan memperingatkan jika tidak valid, ditandatangani sendiri, atau telah kedaluwarsa.

Bagaimana cara mem-bypass SSL di curl PHP?

Untuk melewati validasi sertifikat SSL untuk server lokal dan pengujian, Anda dapat meneruskan opsi -k atau --insecure ke perintah Curl . Opsi ini secara eksplisit memberi tahu Curl untuk melakukan koneksi SSL "tidak aman" dan transfer file. Curl akan mengabaikan peringatan keamanan apa pun tentang sertifikat SSL yang tidak valid dan menerimanya sebagai valid.