Rumah > pembangunan bahagian belakang > tutorial php > Bagaimana untuk membetulkan isu Pihak Berkuasa Sijil HTTP Curl PHP pada Windows

Bagaimana untuk membetulkan isu Pihak Berkuasa Sijil HTTP Curl PHP pada Windows

PHP中文网
Lepaskan: 2024-11-11 12:24:02
ke hadapan
1099 orang telah melayarinya

Permintaan HTTPS yang berjaya melibatkan klien HTTP yang mengesahkan sijil TLS yang disediakan pelayan terhadap senarai akar yang diketahui dan dipercayai sijil. Sambungan PHP Curl tidak berbeza; yang Curl sambungan menggunakan libcurl untuk membuat permintaan HTTPS dan libcurl, yang seterusnya menggunakan perpustakaan TLS seperti OpenSSL untuk mengesahkan permintaan.

Bagaimana untuk membetulkan isu Pihak Berkuasa Sijil HTTP Curl PHP pada Windows

Sambungan Curl memerlukan fail yang sah yang mengandungi semua sijil akar yang dipercayai untuk melengkapkan pengesahan HTTPS dan PHP mendedahkan ini sebagai arahan dalam fail php.ini.

Pada Linux, BSD dan macOS, libcurl boleh lalai kepada akar sistem sijil, tetapi ini tidak boleh dilakukan pada Windows kerana Windows melakukannya tidak datang dengan satu fail yang mengandungi semua akar sistem sijil.

Artikel ini membincangkan dua kemungkinan pendekatan untuk berjaya membuat permintaan HTTPS dengan sambungan Curl dan perkara yang tidak boleh dilakukan yang boleh menyebabkan permintaan HTTPS tidak selamat.

Mengapa ia gagal

$ch = curl_init('https://php.watch');  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
curl_exec($ch); // false  

curl_error($ch);
// SSL certificate problem: unable to get local issuer certificate
Salin selepas log masuk
Salin selepas log masuk

Jika panggilan curl_exec gagal dengan respons palsu dan jika curl_error menunjukkan masalah sijil SSL: tidak dapat mendapatkan setempat ralat sijil pengeluar, ini bermakna Curl tidak diberikan fail yang mengandungi sijil akar atau ia tidak dapat menemuinya.

Ralat ini jarang berlaku pada sistem Linux, BSD dan macOS, tetapi agak biasa pada Windows kerana tiada fail yang ditetapkan untuk mendapatkan root sijil, dan PHP tidak menghantar senarai sijil akar padanya miliknya.

Penyelesaiannya ialah dengan menyediakan fail yang mengandungi akar terkini sijil, atau idealnya, biarkan Curl menghuraikan stor akar asli yang sistem pengendalian asas menyediakan.

Gunakan Pihak Berkuasa Sijil Asli

Pada Curl 7.71 dan lebih baru, adalah mungkin untuk menetapkan Curl pilihan untuk meminta Curl menggunakan sijil akar asli (sistem). Ini berfungsi walaupun pada Windows, di mana Curl menghuraikan sijil akar sistem dan menggunakannya.

Apabila pilihan CURLOPT_SSL_OPTIONS ditetapkan kepada CURLSSLOPT_NATIVE_CA atau bitmask yang mengandungi bit tersebut, Curl cuba menggunakan native stor sijil akar, tertakluk kepada keupayaan dan versi pustaka TLS yang mendasari.

Ini ialah pembetulan yang disyorkan, jika sambungan Curl dibina dengan Curl 7.71 atau lebih baharu dan PHP 8.2 dan lebih baharu.

 $ch = curl_init('https://php.watch');
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
   curl_setopt($ch, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA);
    curl_exec($ch);
Salin selepas log masuk
Salin selepas log masuk

Perhatikan coretan di atas tidak menandakan Versi Curl dan PHP versi, dan menganggap kedua-dua keperluan versi PHP dan Curl dipenuhi. The berikut ialah contoh yang menunjukkan penambahan pilihan Curl secara bersyarat:

$ch = curl_init('https://php.watch');  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
if (defined('CURLSSLOPT_NATIVE_CA')  
  && version_compare(curl_version()['version'], '7.71', '>=')) {  
    curl_setopt($ch, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA);
}  
curl_exec($ch);
Salin selepas log masuk

Muat turun dan simpan fail cacert.pem

Untuk aplikasi yang dijalankan pada versi PHP lebih lama daripada 8.2 (di mana CURLSSLOPT_NATIVE_CA pemalar tidak tersedia), atau apabila versi Curl lebih lama daripada 7.71, penyelesaian alternatif yang disyorkan ialah memuat turun Curl-compatible fail sijil akar dan konfigurasikan PHP atau permintaan Curl untuk menggunakannya.

Projek Curl mengekalkan senarai sijil terkini. Lihat Sijil CA yang diekstrak daripada Mozilla.

  1. Muat turun fail cacert.pem

  2. Alihkan fail ke direktori yang boleh diakses oleh PHP dan pelayan web. Contohnya, ke C:/php/cacert.pem.
  3. Edit fail php.ini dan ubah suai entri curl.cainfo untuk menghala ke laluan mutlak ke fail cacert.pem.

  4. $ch = curl_init('https://php.watch');  
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
    curl_exec($ch); // false  
    
    curl_error($ch);
    // SSL certificate problem: unable to get local issuer certificate
    Salin selepas log masuk
    Salin selepas log masuk
  5. Secara pilihan, mulakan semula pelayan Web (seperti Apache) untuk memuatkan semula fail INI.

Kelemahan pendekatan ini ialah fail cacert.pem mesti dikemas kini secara rutin. The cacert.pem fail yang disediakan oleh projek Curl, sebagai contoh, diekstrak daripada akar kedai yang diselenggara oleh Mozilla. Secara purata, senarai ini dan fail mendapat dikemaskini 4-5 kali setahun. Untuk memastikan keserasian dengan akar terkini senarai sijil, pastikan anda mengemas kini salinan tempatan fail ini kerap

Jika tidak mungkin untuk mengubah suai fail INI, nyatakan laluan mutlak ke fail cacert.pem dalam permintaan Curl juga:

 $ch = curl_init('https://php.watch');
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
   curl_setopt($ch, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA);
    curl_exec($ch);
Salin selepas log masuk
Salin selepas log masuk

Pada PHP 8.2  dengan Curl 7.77 , adalah mungkin untuk rentetan yang mengandungi kandungan cacert.pem dengan pilihan CURLOPT_CAINFO_BLOB.

Atas ialah kandungan terperinci Bagaimana untuk membetulkan isu Pihak Berkuasa Sijil HTTP Curl PHP pada Windows. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
php
sumber:php.watch
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan