PHP - Kesalahan sertifikat SSL: tidak dapat memperoleh sertifikat penerbit lokal


189

Saya menjalankan PHP Versi 5.6.3 sebagai bagian dari XAMPP pada Windows 7.

Ketika saya mencoba menggunakan Mandrill API, saya mendapatkan kesalahan berikut:

Pengecualian 'Mandrill_HttpError' dengan pesan 'API panggilan ke pesan / templat gagal': masalah sertifikat SSL: tidak bisa mendapatkan sertifikat penerbit lokal '

Saya sudah mencoba semua yang saya baca di StackOverflow, termasuk menambahkan yang berikut ke file php.ini:

curl.cainfo = "C:\xampp\php\cacert.pem"

Dan tentu saja diunduh ke lokasi itu file cacert.pem dari http://curl.haxx.se/docs/caextract.html

tetapi setelah semua itu, restart XAMPP dan server Apache tetapi masih mendapatkan kesalahan yang sama.

Saya benar-benar tidak tahu harus mencoba apa lagi.

Adakah yang bisa menyarankan apa lagi yang bisa saya coba?



3
Juga pastikan bahwa Anda telah menghapus komentar baris itu dengan menghapus awal ';'. itu harus curl.cainfo = "C: \ xampp \ php \ cacert.pem" daripada; curl.cainfo = "C: \ xampp \ php \ cacert.pem"
Jon Tan

Apakah menggunakan HTTPS melalui HTTP juga akan menyebabkan kesalahan ini?
javiniar.leonard

Jawaban:


366

Akhirnya berhasil!

  1. Unduh bundel sertifikat .

  2. Letakkan di suatu tempat. Dalam kasus saya, itu adalah c:\wamp\direktori (jika Anda menggunakan Wamp 64 bit maka itu c:\wamp64\).

  3. Aktifkan mod_ssldi Apache dan php_openssl.dlldi php.ini(batalkan komentar dengan menghapus ;di awal). Tapi hati-hati, masalah saya adalah saya memiliki dua php.inifile dan saya perlu melakukan ini di keduanya. Salah satunya adalah yang Anda dapatkan dari ikon bilah tugas WAMP, dan yang lain, dalam kasus saya, diC:\wamp\bin\php\php5.5.12\

  4. Tambahkan baris ini ke sertifikat Anda di kedua php.inifile:

    curl.cainfo="C:/wamp/cacert.pem"
    openssl.cafile="C:/wamp/cacert.pem"
    
  5. Mulai ulang layanan Wamp.


3
Dalam kasus saya itu adalah direktori c: \ xamp \ dan windows-nya 7 dan solusi ini berfungsi dengan sempurna..terima kasih banyak ...
Manu RS

1
Bundel sertifikat terbaru dapat diunduh dari curl.haxx.se/docs/caextract.html
Paul

1
Dalam kasus saya, garis awalnya ada ;di dan saya butuh waktu berjam-jam untuk menyadari bahwa itu berarti sebuah komentar. jadi untuk noobs seperti saya, orang perlu menghapus ;juga
abhyudayasrinet

1
@ SurajNeupane tidak yakin, saya menghabiskan banyak waktu untuk mendapatkannya saat ini, saya menggunakan mesin virtual, seperti Homestead dan saya tidak harus berurusan dengan ini. Ini adalah kasus khusus
Mladen Janjetovic

2
Ini adalah kunciBut be careful, my problem was that I had two php.ini files and I need to do this in both of them. One is the one you get from your WAMP taskbar icon, and another one is, in my case, in C:\wamp\bin\php\php5.5.12\
AA

127

Penafian: Kode ini membuat server Anda tidak aman.

Saya memiliki masalah yang sama dalam file Mandrill.php setelah nomor baris 65 di mana ia mengatakan $ this-> ch = curl_init ();

Tambahkan dua baris berikut:

curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0);

Ini menyelesaikan masalah saya dan juga mengirim email menggunakan localhost tetapi saya sarankan untuk TIDAK menggunakannya pada versi live. Di server langsung Anda, kode harus berfungsi tanpa kode ini.


1
Adakah hal yang dapat saya coba untuk membuat lingkungan pengembang saya berfungsi tanpa bypass ini?
Dor Dadush

4
bagi saya, hanya dengan pengaturan CURLOPT_SSL_VERIFYPEERuntuk falsebekerja.
Francisco Corrales Morales

29
Meskipun secara teknis Anda benar, menonaktifkan SSL adalah ide yang buruk. Bahkan di localhost, lebih baik memuat sertifikat seperti yang disebutkan dalam jawaban lain.
Spinal

Meskipun Anda seorang yang benar secara teknis, menonaktifkan SSL adalah ide yang buruk. Bahkan jika itu sangat keras untuk bekerja dengan cara lain, lebih baik kehilangan pekerjaan Anda daripada melakukan hal-hal dengan cara sys-admin yang tidak tepat. @Spinal

45

Terima kasih @Mladen Janjetovic,

Saran Anda berhasil bagi saya di mac dengan ampps diinstal.

Disalin: http://curl.haxx.se/ca/cacert.pem

Untuk: /Applications/AMPPS/extra/etc/openssl/certs/cacert.pem

Dan diperbarui php.inidengan jalur itu dan restart Apache:

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="/Applications/AMPPS/extra/etc/openssl/certs/cacert.pem"
openssl.cafile="/Applications/AMPPS/extra/etc/openssl/certs/cacert.pem"

Dan menerapkan pengaturan yang sama di instalasi windows AMPPS dan bekerja dengan baik di dalamnya.

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="C:/Ampps/php/extras/ssl/cacert.pem"
openssl.cafile="C:/Ampps/php/extras/ssl/cacert.pem"

: Sama untuk wamp.

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="C:/wamp/bin/php/php5.6.16/extras/ssl/cacert.pem"
openssl.cafile="C:/wamp/bin/php/php5.6.16/extras/ssl/cacert.pem"

Jika Anda mencari untuk menghasilkan sertifikat SSL baru menggunakan SAN untuk localhost, langkah-langkah pada posting ini berfungsi untuk saya Centos 7 / Vagrant / Chrome Browser.


18

Saat Anda melihat halaman http://curl.haxx.se/docs/caextract.html , Anda akan melihat dalam huruf besar sebuah bagian bernama:

RSA-1024 dihapus

Baca, lalu unduh versi sertifikat yang menyertakan sertifikat 'RSA-1024'. https://github.com/bagder/ca-bundle/blob/e9175fec5d0c4d42de24ed6d84a06d504d5e5a09/ca-bundle.crt

Itu akan bekerja dengan Mandrill.

Menonaktifkan SSL adalah ide yang buruk.


1
Ini memperbaiki masalah dengan AWS / Guzzle / cURL yang telah saya perjuangkan sepanjang hari. Terima kasih!
voidstate

@voidstate Saya tahu ini sudah tua tetapi Anda juga dapat memotongnya dalam guzzle menggunakan ['verifikasi' => false] ini, untuk dokumen lengkap tentang ssl / curl / guzzle
John

@ John tetapi itu akan menonaktifkan verifikasi SSL yang bukan apa yang ingin Anda lakukan, jadi saya tidak akan menyarankan melakukan itu.
Arturo Alvarado

1
Untuk Windows, Anda harus menyimpan file di server Anda (mis. Ke C: \ curl \ curl-ca-bundle.crt), lalu tambahkan yang berikut ke php.ini Anda: [curl] curl.cainfo = " C: /curl/curl-ca-bundle.crt "[openssl] openssl.cafile =" C: /curl/curl-ca-bundle.crt "
voidstate

Saya baru saja mengalami ini setelah bekerja dengan sempurna untuk waktu yang lama (bahkan selamat dari perubahan server) tetapi saya mengalami kesulitan untuk memahami apa yang sebenarnya terjadi di sini. Apakah itu curl atau openssl telah diperbarui dan memilikinya; bundel diubah menjadi yang tidak kompatibel dengan mailchimp?
Sammaye

11

Langkah-langkah di atas, meskipun membantu, tidak bekerja untuk saya di Windows 8. Saya tidak tahu hubungan-hubungannya, tetapi langkah-langkah di bawah ini berhasil. Pada dasarnya perubahan dalam file cacert.pem. Semoga ini bisa membantu seseorang.

  • Unduh file cacert.pem dari sini: http://curl.haxx.se/docs/caextract.html
  • Simpan file di folder instalasi PHP Anda. (mis: Jika menggunakan xampp - simpan di c: \ Installation_Dir \ xampp \ php \ cacert.pem).
  • Buka file php.ini Anda dan tambahkan baris ini:
  • curl.cainfo = ”C: \ Installation_Dir \ xampp \ php \ cacert.pem” openssl.cafile = ”C: \ Installation_Dir \ xampp \ php \ cacert.pem”
  • Mulai ulang server Apache Anda dan itu akan memperbaikinya (Cukup hentikan dan mulai layanan sesuai kebutuhan).

11

Saya menemukan Solusi baru tanpa sertifikasi yang diperlukan untuk memanggil ikal hanya menambahkan dua kode baris.

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

9
Meskipun ini bisa berfungsi, ini sama sekali tidak direkomendasikan. Anda pada dasarnya mengatakan, percayai semua sertifikat ... dan itu juga membuka aplikasi Anda untuk kemungkinan serangan jika Anda lupa dan kode Anda membuat produksi dengan perubahan ini ... sebenarnya tidak banyak pekerjaan untuk mengunduh bundel CA dan tambahkan point PHP ke dalamnya.
user919426

itu konsep keriting, jadi setiap kali Anda menggunakan ikal ada tambahkan kode di atas
Manish sharma

8

Jika Anda tidak memiliki akses ke php.ini , menambahkan kode ini (setelah $ch = curl_init();baris Anda ) berfungsi untuk saya:

$certificate_location = "C:\Program Files (x86)\EasyPHP-Devserver-16.1\ca-bundle.crt"; // modify this line accordingly (may need to be absolute)
curl_setopt($ch, CURLOPT_CAINFO, $certificate_location);
curl_setopt($ch, CURLOPT_CAPATH, $certificate_location);

Kemudian, Anda hanya perlu mengunduh ca-bundle.crt dan menyimpannya ke lokasi yang Anda tentukan $certificate_location.


3

Saya punya Solusi Sangat Sederhana untuk masalah ini. Anda dapat melakukan ini tanpa file sertifikat apa pun ..

Buka Laravel Root Folder -> Vender -> guzzlehttp -> guzzle -> src

buka Client.php

temukan $ default Array. yang terlihat seperti ini ..

$defaults = [
    'allow_redirects' => RedirectMiddleware::$defaultSettings,
    'http_errors'     => true,
    'decode_content'  => true,
    'verify'          => true,
    'cookies'         => false
];

Sekarang pekerjaan utama adalah mengubah nilai kunci verifikasi ..

'verify'          => false,

Jadi Setelah ini tidak akan memeriksa Sertifikat SSL untuk Permintaan CURL ... Solusi ini berfungsi untuk saya. Saya menemukan solusi ini setelah banyak penelitian ...


2

menguraikan jawaban di atas untuk penyebaran server.

$hostname = gethostname();
if($hostname=="mydevpc")
{
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
}

harus melakukan trik untuk lingkungan pengembangan tanpa membahayakan server saat digunakan.


Menjalankan berbagai bagian kode Anda di lingkungan yang berbeda tidak terdengar seperti konsep yang baik - itu membuat proses debug lebih sulit
Nico Haase

2

Saya mencoba ini berhasil

Buka

vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php

dan ubah ini

 $conf[CURLOPT_SSL_VERIFYHOST] = 2;
 `enter code here`$conf[CURLOPT_SSL_VERIFYPEER] = true;

untuk ini

$conf[CURLOPT_SSL_VERIFYHOST] = 0;
$conf[CURLOPT_SSL_VERIFYPEER] = FALSE;

0

Saya memiliki masalah yang sama saat membangun aplikasi di AppVeyor.

  • Unduh https://curl.haxx.se/ca/cacert.pem kec:\php
  • Aktifkan openssl echo extension=php_openssl.dll >> c:\php\php.ini
  • Temukan sertifikatecho curl.cainfo=c:\php\cacert.pem >> c:\php\php.ini

0

Jika tidak ada solusi di atas yang berfungsi untuk Anda coba perbarui instalasi XAMPP Anda ke versi yang lebih baru.

Saya menjalankan XAMPP dengan php 5.5.11, kode persis yang sama tidak berfungsi, saya memutakhirkan ke XAMPP dengan php 5.6.28 dan solusi di atas bekerja.

Selain itu, hanya memperbarui PHP tidak berfungsi, sepertinya kombinasi pengaturan apache dan php pada versi XAMPP tersebut.

Semoga ini bisa membantu seseorang.


0

Saya mendapat kesalahan seperti:

failed loading cafile stream: `C:\xamppPhp\apache\bin\curl-ca-bundle.crt`

Saya menggunakan mesin windows. Jadi saya mengikuti langkah-langkah di bawah ini.

1. I have downloaded .pem file from " https://curl.haxx.se/docs/caextract.html "

2. Then I kept the downloaded file inside  "C:/xamppPhp/apache/bin/" folder and renamed the same downloaded file to "curl-ca-bundle.crt".

3. I restarted XAMPP and cleared the cache.
4. It's done.

Semoga bisa membantu seseorang


0

Saya menghadapi masalah seperti ini di sistem lokal saya tetapi tidak di server langsung. Saya juga menyebutkan solusi lain pada halaman ini sebelumnya, tetapi itu tidak bekerja di localhost . Jadi, temukan solusi baru untuk ini, yaitu bekerja di Server localhost-WAMP .

Kesalahan CURL #: Masalah sertifikat SSL: tidak dapat memperoleh sertifikat penerbit lokal

terkadang sistem tidak dapat menemukan cacert.pem Anda di drive Anda. jadi Anda bisa mendefinisikan ini dalam kode Anda di mana Anda akan menggunakan CURL

Perhatikan bahwa saya memenuhi semua persyaratan untuk ini seperti perpustakaan OPEN-SSL aktif dan hal-hal lain.

periksa kode CURL ini .

 $curl = curl_init();
 curl_setopt_array($curl, array(
            CURLOPT_URL =>$url,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "GET",
            CURLOPT_RETURNTRANSFER=> true,
        ));
curl_setopt($curl, CURLOPT_CAINFO, "f:/wamp/bin/cacert.pem"); // <------ 
curl_setopt($curl, CURLOPT_CAPATH, "f:/wamp/bin/cacert.pem"); // <------
$response = json_decode(curl_exec($curl),true);
$err = curl_error($curl);
curl_close($curl);

tetapi solusi ini mungkin tidak berfungsi di server langsung. karena jalur absolut dari cacert.pem


0

Saya punya solusi yang tepat untuk masalah ini, mari kita coba dan memahami akar penyebab masalah ini. Masalah ini muncul ketika server jauh ssl tidak dapat diverifikasi menggunakan sertifikat root di toko sertifikat sistem Anda atau ssl jarak jauh tidak diinstal bersama dengan sertifikat berantai. Jika Anda memiliki sistem linux dengan akses ssh root, maka dalam hal ini Anda dapat mencoba memperbarui toko sertifikat Anda dengan perintah di bawah ini:

update-ca-certificates

Jika masih, itu tidak berfungsi maka Anda perlu menambahkan root dan sertifikat sementara server jarak jauh di toko sertifikat Anda. Anda dapat mengunduh sertifikat root dan perantara dan menambahkannya di direktori / usr / local / share / ca-sertifikat dan kemudian jalankan perintah update-ca-certificates. Ini harus melakukan trik. Demikian pula untuk windows Anda dapat mencari cara menambahkan root dan sertifikat menengah.

Cara lain Anda dapat mengatasi masalah ini adalah dengan meminta tim server jarak jauh untuk menambahkan sertifikat ssl sebagai kumpulan sertifikat root domain, sertifikat menengah dan sertifikat root.


-4

untuk membuang waktu Anda dapat mencoba ini:

$client = new Client(env('API_HOST'));
$client->setSslVerification(false);

diuji pada guzzle / guzzle 3. *


1
apakah ada titik menjawab pertanyaan lama 3 tahun yang memiliki jawaban yang diterima dengan 200+ upvotes?
treyBake

jawaban saya lebih sederhana daripada yang di atas, Anda akan melihat saya akan mendapatkan 10 upvotes selama beberapa bulan ...
fico7489

1
Saya sangat meragukannya, tidak melihat penyebutan di OP ... jadi itu jawaban yang tidak terkait. Itu sama ketika seseorang memberikan solusi jQuery untuk masalah JavaScript. Itu tidak relevan.
treyBake

itu tidak mengubah fakta itu tidak digunakan di sini. Apakah Anda menyarankan solusi Linux untuk pengguna Windows karena itu adalah sistem operasi server yang paling banyak digunakan? Tidak semua orang ingin menggunakan Guzzle, saya pribadi tidak pernah menggunakannya sekali selama bertahun-tahun menggunakan PHP. Bagi saya, permintaan HTTP sebenarnya tidak terlalu sulit untuk membutuhkan paket untuk itu.
treyBake

1
sepenuhnya sadar - itu tidak diperlukan .. hanya membaca dokumen untuk curl dan itu semua cukup jelas. Ini bukan tentang menjadi lebih pintar ... ini tentang menjawab pertanyaan dengan benar
treyBake
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.