HTTPS ve SSL3_GET_SERVER_CERTIFICATE: sertifika doğrulaması başarısız, CA TAMAM


208

XAMPP kullanıyorumGeliştirme için . Son zamanlarda xampp kurulumumu eski bir sürümden 1.7.3'e yükselttim.

Şimdi HTTPS etkin siteleri kıvırdığımda aşağıdaki istisnayı alıyorum

Önemli hata: 'cURL kaynağı iletisiyle yakalanmamış' RequestCore_Exception 'özel durumu: Kaynak kimliği # 55; cURL hatası: SSL sertifikası sorunu, CA sertifikasının TAMAM olduğunu doğrulayın. Ayrıntılar: hata: 14090086: SSL rutinleri: SSL3_GET_SERVER_CERTIFICATE: sertifika doğrulaması başarısız oldu (60) '

Herkes bu sorunu çözmek için PHP kodundan bazı kıvrılma seçeneklerini kullanmanızı önerir. Bence bu böyle olmamalı. Çünkü eski XAMPP sürümümle ilgili herhangi bir sorun yaşamadım ve sadece yeni sürümü yükledikten sonra oldu.

Ben PHP kurulum, Apache vb ayarları değiştirmek bu sorunu çözebilir anlamak için yardıma ihtiyacım var.

Yanıtlar:


145

curl, kabul edilen CA'ların bir listesini içerir, ancak artık HERHANGİ BİR CA sertifikasını paketlemez. Bu nedenle, varsayılan olarak tüm SSL sertifikalarını doğrulanamaz olarak reddeder.

CA'nızın sertifikasını almanız ve ona kıvırmanız gerekir. Daha fazla ayrıntı için cURLS'nin Sunucu SSL Sertifikaları ile İlgili Ayrıntılar bölümüne bakınız .


4
Kıvırmak Amazon web hizmetleri php kütüphanesinde oluyor. Kütüphane kodunu düzenlemeden nasıl düzelteceğimi anlamadım.
Josnidhin

41
Ardından sertifika doğrulamayı kapatın ( CURLOPT_SSL_VERIFYPEER-> yanlış). SSL yapmaya çalıştığınız sitenin CA sertifikasını eklersiniz veya CA doğrulamasını devre dışı bırakırsınız. Bunlar sadece iki seçenek.
Marc B

78
Sadece Bilginize - ayarı CURLOPT_SSL_VERIFYPEERiçin falseyenilgilerden SSL kullanarak amacını.
kadar

13
@Till SSL'nin amacının yarısını yenmez mi? Siz ve akranınız arasında hala gizlilik elde edersiniz: sadece akranınızın özgünlüğüne sahip değilsiniz.
Mark Fox

10
orijinal olmadan, gönderdiğiniz verileri şifrelemenin anlamı nedir? MITMed olduysanız veriler yine de tehlikeye
atılmış

290

Windows'da oldukça yaygın bir sorundur. Sadece sete ihtiyaç cacert.pemiçincurl.cainfo .

PHP 5.3.7'den beri şunları yapabilirsiniz:

  1. https://curl.haxx.se/ca/cacert.pem dosyasını indirin ve bir yere kaydedin.
  2. güncelleme php.ini- curl.cainfo = "PATH_TO / cacert.pem" ekle

Aksi takdirde, her cURL kaynağı için aşağıdakileri yapmanız gerekir:

curl_setopt ($ch, CURLOPT_CAINFO, "PATH_TO/cacert.pem");

2
Bu, OS X'deki XAMPP'de benim için çalıştı. Yerel bir sertifikayı bulamadığı için bir Wordpress eklentisinin güncellenmemesi sorunu düzeltildi.
Jonathan Nicol

8
Apache kullanarak Windows'ta bu sorunu çözmeye çalışan herkes için, PHP kodumda tam yolu (yani C: \ PATH_TO \ cacert.pem) ayarlamam gerekiyordu. IIS'de, göreli yol işe yaramış gibi görünüyordu.
http203

Cacert.pem aynı dizinde ise curl_setopt ($ ch, CURLOPT_CAINFO, dirname ( FILE ). '/Cacert.pem'); çalışacak
mujaffars

7
WampServer'ı kullanırken 2., değişkeni iki ayrı php.inidosyaya eklemelisiniz . Bkz. Stackoverflow.com/a/25706713/1101095
Nate

Şaşırtıcı / ironik olan şey, herhangi bir ekstra seçenek belirtmeden HTTPS üzerinden curl.haxx.se/ca/cacert.pem dosyasını indirebilmenizdir . Curl.haxx.se sertifikası curl'e mi yedeklendi?
qbolec

84

Uyarı: Bu, SSL'nin korumak için tasarlandığı güvenlik sorunlarını getirebilir ve kod tabanınızın tamamını güvensiz hale getirir. Önerilen her uygulamaya aykırıdır.

Ama benim için işe yarayan gerçekten basit bir düzeltme şunları aramaktı:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

aramadan önce:

curl_exec():

php dosyasında.

Bunun SSL sertifikalarının tüm doğrulamasını devre dışı bıraktığına inanıyorum.


65
... ve sertifikaların doğrulanmasını devre dışı bırakarak, SSL / TLS'nin aksi takdirde korumayı amaçladığı olası MITM saldırılarına kapıyı açık bırakırsınız. BUNU YAPMAYIN!
Bruno

12
Evet. Cevapta buna daha fazla dikkat çekmeliydim. Bunu sadece önemli bir şey üzerinde çalışmıyorsanız yapın. Ben şahsen programladığım web sitelerine erişmek için localhost üzerinde kullanıyorum.
Chris Dutrow

3
Benden alçalt. Bu, kodunuzu çalıştırmak için kirli bir düzeltme, ancak bir çözüm değil. Tarafından verilen cevap Артур Курицын is better better.
Ilija

2
@Bruno Bu, yardımcı komut dosyaları, testler, güvenilir uygulamalar, intranet, ..... için mükemmel bir çözümdür. SSL hakkında KÜÇÜK bilen herkes, hangi durumlarda sertifika doğrulamasının atlanabileceğini bilir. Bu cevaba ilişkin tüm 'akıllı' yorumlar ve 'BU YAPMAYIN' gibi şeyler sadece NONSENSE!
Kenyakorn Ketsombut

5
... " SSL hakkında KÜÇÜK bilen herkes [...] " ... ve kaç kişinin SSL / TLS'nin temelleri hakkında biraz bilgi sahibi olmaktan bile rahatsız olmayacağına şaşıracaksınız. hata mesajı için hızlı bir düzeltme kopyalamak / yapıştırmak için buraya tıklayın.
Bruno

53

Kaynak: http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html

Kıvrılma: SSL sertifikası sorunu, CA sertifikasının uygun olduğunu doğrulayın

07 Nisan 2006

Curl ile güvenli bir URL açarken aşağıdaki hatayı alabilirsiniz:

SSL sertifikası sorunu, CA sertifikasının uygun olduğunu doğrulayın

Hatanın nedenini ve bu konuda ne yapmanız gerektiğini açıklayacağım.

Hatadan kurtulmanın en kolay yolu betiğinize aşağıdaki iki satırı eklemek olacaktır. Bu çözüm bir güvenlik riski oluşturmaktadır.

//WARNING: this would prevent curl from detecting a 'man in the middle' attack
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); 

Bu iki parametrenin ne yaptığını görelim. Kılavuzdan alıntı.

CURLOPT_SSL_VERIFYHOST : 1 SSL eş sertifikasında ortak bir ad olup olmadığını kontrol etmek için. 2, ortak bir adın varlığını kontrol etmek ve sağlanan ana bilgisayar adıyla eşleştiğini doğrulamak için.

CURLOPT_SSL_VERIFYPEER : CURL'un eş sertifikasını doğrulamasını durdurmak için FALSE. Doğrulamak için alternatif sertifikalar CURLOPT_CAINFO seçeneğiyle belirtilebilir veya CURLOPT_CAPATH seçeneğiyle bir sertifika dizini belirtilebilir. CURLOPT_SSL_VERIFYPEER devre dışı bırakılmışsa CURLOPT_SSL_VERIFYHOST değerinin TRUE veya FALSE olması gerekebilir (varsayılan olarak 2'dir). CURLOPT_SSL_VERIFYHOST değerini 2 olarak ayarlamak (Bu varsayılan değerdir) size sunulan sertifikanın, uzak kaynağa erişmek için kullandığınız URN ile eşleşen bir 'ortak ada' sahip olduğunu garanti eder. Bu sağlıklı bir kontroldür ancak programınızın bozulmadığını garanti etmez.

'Ortadaki adamı' girin

Programınız bunun yerine başka bir sunucuyla konuşmak için yanlış yönlendirilebilir. Bu, dns veya arp zehirlenmesi gibi çeşitli mekanizmalarla başarılabilir (Bu, başka bir gün için bir hikaye). Davetsiz misafir ayrıca programınızın beklediği aynı 'ortak ad' ile bir sertifikayı da imzalayabilir. İletişim hala şifrelenirdi, ancak sırlarınızı bir sahtekâra veriyorsunuz. Bu tür saldırılara 'ortadaki adam' denir

'Ortadaki adamı' yenmek

Bize sunulan sertifikanın gerçekten iyi olduğunu doğrulamamız gerekiyor. Bunu makul * güvendiğimiz bir sertifika ile karşılaştırarak yaparız.

Uzak kaynak Verisign, GeoTrust ve diğerleri gibi ana CA'lardan biri tarafından verilen bir sertifika ile korunuyorsa, Mozilla'nın http://curl.haxx.se/docs/caextract adresinden alabileceğiniz CA sertifika paketiyle güvenle karşılaştırabilirsiniz. .html

Dosyayı cacert.pemsunucunuzda bir yere kaydedin ve betiğinizde aşağıdaki seçenekleri ayarlayın.

curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, TRUE); 
curl_setopt ($ch, CURLOPT_CAINFO, "pathto/cacert.pem");

Yukarıdaki Bilgilerin tümü için http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html adresine gidin.


38
Bilgilerinizin kaynağını kredilendirmek ve sadece buraya kopyalayıp yapıştırmak yerine sadece soru ile ilgili bazı bölümleri alıntılamak kibar kabul edilir!
Dan Herd

1
Üzgünüm, Uzaktaydım, evet Dan'ı bunun için uyguluyorum ve Postayı Güncelledim
Deepak Oberoi

6
En azından Deepak bunu araştırmak için çaba harcadı. @ danherd Dehşete düşmüş, sadece kodu bir yerden aldığını bulmak için araştırma yaptınız mı? Bu kodun atıf hakkı neydi? Başkasının hatalarını bulmak için zamanınızı boşa harcamak yerine kendi başınıza birine yardım etmeye çalışın. Kavga etme, paylaş!
GTodorov

17

Yukarıdaki çözümler harika, ancak WampServer kullanıyorsanız, curl.cainfodeğişkeninphp.ini işe yaramadığını görebilirsiniz.

Sonunda WampServer'ın iki php.inidosyası olduğunu gördüm :

C:\wamp\bin\apache\Apachex.x.x\bin
C:\wamp\bin\php\phpx.x.xx

Birincisi, PHP dosyaları bir web tarayıcısı üzerinden çağrıldığında, ikincisi ise komut satırı üzerinden veya bir komut çağrıldığında kullanılır shell_exec().

TL; DR

WampServer kullanıyorsanız, curl.cainfosatırı her iki php.ini dosyaya da eklemeniz gerekir .


6

Kutsal olan her şeyin aşkı için ...

Benim durumumda, openssl.cafilePHP config değişkenini PEM dosya yoluna ayarlamak zorunda kaldım .

curl.cainfoPHP'nin yapılandırmasında ayarın tam olarak gerekli olduğu birçok sistem olduğu konusunda çok doğru olduğuna inanıyorum , ancak çalıştığım ortamda eboraas / laravel Debian 8 (jessie) ve PHP kullanan docker konteyneri 5.6, bu değişkenin ayarlanması hile yapmadı.

Ben çıktı php -io belirli yapılandırma ayarı hakkında bir şey bahsetmedi fark ettim , ama hakkında birkaç satır var openssl. Bir Orada hem openssl.capathve openssl.cafileopsiyon, ama sadece nihayet HTTPS URL'leri için sorun olmaya PHP yoluyla ikinci bir izin curl ayarı.


Teşekkür ederim! Curl.cainfo'yu ayarlamak benim için de işe yaramadı, ancak ayar openssl.cafile işe yaramadı! XAMPP ve PHP 7.1.1 ile Windows 7 kullanıyorum.
knezmilos

@knezmilos openssl.cafile dosyasını nasıl ayarladınız? nereden indirdiniz ve nasıl etkinleştirdiniz?
Krys

Peki, bir süre oldu ama sanırım böyle bir şey: phl'de curl.cainfo = "C: \ xampp \ cacert \ cacert.pem" ve openssl.cafile = "C: \ xampp \ cacert \ cacert.pem". ini, sanırım buradaki cevaplardan birinden pem dosyasını aldım.
knezmilos

1
"Kutsal olan her şeyin aşkı için ..." Bu benim Ubuntu 18.08 / Apache / Php7.2 kurulumu için çalıştı. Kıvırma hatası doğru dosyayı gösteriyorsa, o zaman kesinlikle açılır hatadır
JTG

4

Bazen iletişim kurmaya çalıştığınız uygulamanın kendinden imzalı sertifikaları varsa, http://curl.haxx.se/ca/cacert.pem adresindeki normal cacert.pem sorunu çözmez.

Hizmet uç noktası url'sinden eminseniz tarayıcıya basın, sertifikayı manuel olarak "Zincirli X 509 sertifikası (PEM)" biçiminde kaydedin. Bu sertifika dosyasını

curl_setopt ($ch, CURLOPT_CAINFO, "pathto/{downloaded certificate chain file}");   

4

Amazon AMI linux'da da aynı hata var.

Ben ayarıyla çözüldü curl.cainfo üzerinde /etc/php.d/curl.ini

https://gist.github.com/reinaldomendes/97fb2ce8a606ec813c4b

Ekleme Ekim 2018

Amazon Linux v1'de bu dosyayı düzenleyin

vi /etc/php.d/20-curl.ini

Bu satırı eklemek için

curl.cainfo="/etc/ssl/certs/ca-bundle.crt"

Mükemmel teşekkürler! Soruyu, başka bir cevap oluşturmak yerine, benim için sorunu çözen şeyi tam olarak ekleyecek şekilde güncelledim.
Tim

3

CURLOPT_CAINFO için kıvrılma seçeneklerini ayarlarken lütfen tek tırnak kullanmayı unutmayın, çift tırnak kullanmak yalnızca başka bir hataya neden olur. Yani seçeneğiniz şöyle görünmelidir:

curl_setopt ($ch, CURLOPT_CAINFO, 'c:\wamp\www\mywebfolder\cacert.pem');

Ayrıca, php.ini dosya ayarınız şöyle yazılmalıdır: (çift tırnaklarıma dikkat edin)

curl.cainfo = "C:\wamp\www\mywebfolder"

Bunu doğrudan söyleyen satırın altına koydum: extension=php_curl.dll

(Sadece düzenleme amacıyla, içinde herhangi bir yere koyabilirsiniz php.ini, ben sadece başka bir kıvırmak referans yakın koymak böylece anahtar kelime kıvırmak kullanarak arama yaparken ben bir alanda her iki kıvırmak referansları bulabilirsiniz.)


1
Umarım php.ini üst klasörü yerine pem dosyasına işaret etmelidir
dejjub-AIS

2

Burada www.googleapis.com bir sayfa almak için GuzzleHttp (Mac'te php + apache) almaya çalışırken sona erdi.

İşte herkese yardım etmesi için son çözümüm.

Size bu hatayı veren etki alanı için sertifika zincirine bakın. Benim için googleapis.com

openssl s_client -host www.googleapis.com -port 443

Böyle bir şeyi geri alacaksınız:

Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.googleapis.com
   i:/C=US/O=Google Inc/CN=Google Internet Authority G2
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority

Not: Sorunu çözdükten sonra bunu yakaladım, zincir çıkışınıza farklı görünebilir.

Sonra php izin verilen sertifikalara bakmak gerekir. Bir sayfada phpinfo () komutunu çalıştırın.

<?php echo phpinfo();

Ardından, sayfa çıktısından yüklenen sertifika dosyasını arayın:

openssl.cafile  /usr/local/php5/ssl/certs/cacert.pem

Bu, doğru sertifikaları ekleyerek düzeltmeniz gereken dosyadır.

sudo nano /usr/local/php5/ssl/certs/cacert.pem

Temel olarak bu dosyanın sonuna doğru sertifika "imzalarını" eklemeniz gerekir.

Bunlardan bazılarını burada bulabilirsiniz: İhtiyacınız olursa zincirde google / başkalarını aramanız gerekebilir.

Şuna benziyorlar:

örnek sertifika resmi

( Not: Bu bir resimdir, böylece insanlar yığın yığınından sertifikaları kopyalayıp yapıştırmazlar )

Doğru sertifikalar bu dosyaya girdikten sonra, apache'yi yeniden başlatın ve test edin.


0

ca-certificatesPaketi yeniden yüklemeyi deneyebilir veya söz konusu sertifikanın burada açıklandığı gibi açıkça izin vermesini sağlayabilirsiniz .


-5

Çözüm çok basit! Bu satırı daha önce koyun curl_exec:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

Benim için çalışıyor.


7
Hiçbir zaman, hiç veri aktarım sırasında başkalarının eline geçerse devre dışı akran doğrulama umursamıyorsun sürece.
rdlowrey

Kabul. Güvenli bir uygulama istiyorsanız akran doğrulamanız gerekir.
braden

2
"Asla, hiçbir zaman eş doğrulamayı devre dışı bırakma" Varsayılan tarayıcı işlevselliği olmasını İSTEMİYORSUN haha. Ayrıca, bu neden bu kadar çok düşürüldü? Bu, kısa, tatlı, ve etkili olan noktaya verilen tek cevaptır.
Adam F

@AdamF FYI, tarayıcılar eş sertifikayı varsayılan olarak doğrular, size yalnızca uyarı ile hataları el ile atlatma seçeneği sunar.
Bruno
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.