PHP - SSL sertifika hatası: yerel yayıncı sertifikası alınamıyor


189

PHP Sürüm 5.6.3'ü Windows 7'de XAMPP'nin bir parçası olarak çalıştırıyorum.

Mandrill API'sini kullanmaya çalıştığımda, aşağıdaki hatayı alıyorum:

'İletilere / gönderme şablonuna API çağrısı başarısız oldu: SSL sertifikası sorunu: yerel yayıncı sertifikası alınamıyor' iletisiyle yakalanmamış istisna 'Mandrill_HttpError'

Ben zaten php.ini dosyasına aşağıdaki ekleyerek dahil StackOverflow okudum her şeyi denedim:

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

Ve tabii ki bu konuma cacert.pem dosyasını http://curl.haxx.se/docs/caextract.html

ancak tüm bunlardan sonra, XAMPP ve Apache sunucusunu yeniden başlattı ama yine de aynı hatayı alıyordu.

Başka ne denemek bilmiyorum.

Başka ne deneyebilirim kimse tavsiye edebilir?



3
Ayrıca ';' başlangıcını kaldırarak bu satırı kaldırmış olduğunuzdan emin olun. curl.cainfo = "C: \ xampp \ php \ cacert.pem" yerine curl.cainfo = "C: \ xampp \ php \ cacert.pem" olmalıdır.
Jon Tan

HTTP üzerinden HTTPS kullanmak da bu hataya neden olur mu?
javiniar.leonard

Yanıtlar:


366

Sonunda işe yaradı!

  1. Sertifika paketini indirin .

  2. Bir yere koy. Benim durumumda, bu c:\wamp\dizin (Wamp 64 bit kullanıyorsanız o zaman c:\wamp64\).

  3. mod_sslApache'de ve php_openssl.dlliçinde etkinleştirin php.ini( ;başlangıçta kaldırarak bunları kaldırın ). Ancak dikkatli olun, benim sorunum iki php.inidosyam olması ve her ikisinde de yapmam gerektiğiydi. Biri WAMP görev çubuğu simgenizden aldığınız ve diğeri benim durumumdaC:\wamp\bin\php\php5.5.12\

  4. Bu satırları her iki php.inidosyada da sertifikanıza ekleyin :

    curl.cainfo="C:/wamp/cacert.pem"
    openssl.cafile="C:/wamp/cacert.pem"
    
  5. Wamp hizmetlerini yeniden başlatın.


3
Benim durumumda c: \ xamp \ dizini ve Windows 7 ve bu çözüm mükemmel çalışıyor .. çok teşekkürler ...
Manu RS

1
En yeni sertifika paketi orijinal curl sitesinden indirilebilir curl.haxx.se/docs/caextract.html
Paul

1
Benim durumumda hattın ;başında bir a vardı ve bunun bir yorum olduğu anlamına gelmesi saatler sürdü. böylece benim gibi acemi bir ihtiyacı gidermek için ;de
abhyudayasrinet

1
@SurajNeupane emin değilim, bunu geri almak için çok zaman harcadım, Homestead gibi sanal makineleri kullanıyorum ve bununla uğraşmak zorunda değilim. Bu özel bir
durumdu

2
Bu anahtarBut 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

Yasal Uyarı: Bu kod sunucunuzu güvensiz hale getirir.

Ben $ this-> ch = curl_init () diyor satır numara 65 sonra Mandrill.php dosyasında aynı sorunu vardı;

Aşağıdaki iki satırı ekleyin:

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

Bu benim sorunum çözüldü ve ayrıca localhost kullanarak e-posta gönderdi ama ben canlı sürümü canlı kullanmak DEĞİL öneririz. Canlı sunucunuzda kodun bu kod olmadan çalışması gerekir.


1
Bu bypass olmadan geliştiricilerimin ortamını çalıştırmaya çalışabileceğim herhangi bir şey var mı?
Dor Dadush

4
Benim için sadece ayarıyla CURLOPT_SSL_VERIFYPEERiçin falseçalıştı.
Francisco Corrales Morales

29
Teknik olarak doğruyken, SSL'yi devre dışı bırakmak kötü bir fikirdir. Localhost üzerinde bile, diğer cevapta belirtildiği gibi sertifikaları düzgün bir şekilde yüklemek daha iyidir.
Spinal

Teknik olarak doğru olsa da, SSL'yi devre dışı bırakmak kötü bir fikirdir. Başka bir şekilde çalışmaya karşı son derece dirençli olsa bile, işinizi kaybetmek uygun olmayan sys-admin yolundan daha iyi. @Spinal

45

@Mladen Janjetovic,

Öneriniz, amper yüklü olan mac'ta benim için çalıştı.

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

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

Ve php.inibu yolla güncellendi ve Apache yeniden başlatıldı:

[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"

Ve aynı ayarı Windows AMPPS kurulumunda uyguladı ve içinde de mükemmel çalıştı.

[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"

: Wamp için de aynı şey geçerli.

[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"

Localhost için SAN kullanarak yeni SSL sertifikası oluşturmak istiyorsanız, bu yayındaki adımlar benim için çalıştı Centos 7 / Vagrant / Chrome Browser.


18

Http://curl.haxx.se/docs/caextract.html sayfasını görüntülediğinizde, büyük harflerle adlandırılan bir bölümü fark edeceksiniz:

RSA-1024 kaldırıldı

Okuyun ve 'RSA-1024' sertifikalarını içeren sertifikaların sürümünü indirin. https://github.com/bagder/ca-bundle/blob/e9175fec5d0c4d42de24ed6d84a06d504d5e5a09/ca-bundle.crt

Bunlar Mandrill ile çalışacak.

SSL'yi devre dışı bırakmak kötü bir fikirdir.


1
Bu, tüm gün mücadele ettiğim AWS / Guzzle / cURL ile ilgili bir sorunu düzeltti. Teşekkür ederim!
voidstate

Bu kullanarak guzzle içinde @voidstate Bu eski olduğunu biliyorum ama bunun baypas da yapabilirsiniz [ 'doğrulamak' => false], tam dokümana ilişkin ssl / bukle / guzzle buraya gidin guzzle.readthedocs.org/en/latest/...
John

@John ama yapmak istediğiniz şey olmayan SSL doğrulamasını bozabilir, bu yüzden bunu yapmanızı önermem.
Arturo Alvarado

1
Windows için dosyaları sunucunuza kaydetmeniz gerekir (örn. C: \ curl \ curl-ca-bundle.crt dosyasına), ardından php.ini'nize aşağıdakileri ekleyin: [curl] curl.cainfo = " C: /curl/curl-ca-bundle.crt "[openssl] openssl.cafile =" C: /curl/curl-ca-bundle.crt "
voidstate

Ben sadece bu yaş için mükemmel çalıştı sonra bile (bir sunucu değişikliği hayatta kaldı) ama tam olarak burada neler olduğunu anlamakta sorun yaşıyorum. Curl veya openssl güncellendi mi ve değiştirildi mi; ca-demeti mailchimp ile uyumsuz olana değiştirildi mi?
Sammaye

11

Yukarıdaki adımlar, yardımcı olsa da, Windows 8'de benim için çalışmadı. İşbirliği bilmiyorum, ancak aşağıdaki adımlar işe yaradı. Temel olarak cacert.pem dosyasındaki bir değişiklik. Umarım bu birine yardımcı olur.

  • Cacert.pem dosyasını buradan indirin: http://curl.haxx.se/docs/caextract.html
  • Dosyayı PHP kurulum klasörünüze kaydedin. (örneğin: xampp kullanıyorsanız - c: \ Installation_Dir \ xampp \ php \ cacert.pem klasörüne kaydedin).
  • Php.ini dosyanızı açın ve şu satırları ekleyin:
  • curl.cainfo = ”C: \ Installation_Dir \ xampp \ php \ cacert.pem” openssl.cafile = ”C: \ Installation_Dir \ xampp \ php \ cacert.pem”
  • Apache sunucunuzu yeniden başlatın ve düzeltmesi gerekir (Hizmetleri gerektiği şekilde durdurup başlatın).

11

Ben sadece iki satır kodu eklemek için curl aramak için gerekli herhangi bir sertifika olmadan yeni Çözüm buldum.

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

9
Bu işe yarayabilir olsa da, bu hiç tavsiye edilmez. Temel olarak, tüm sertifikalara güvenin diyorsun ... ve ayrıca unutursanız ve kodunuz bu değişiklikle üretime geçirirse, uygulamanızı olası saldırı için açar ... CA paketini indirmek için çok fazla iş ve ona PHP ekler.
user919426

Bu curl kavramı, bu yüzden curl kullandığınızda yukarıdaki kodu ekleyin
Manish sharma

8

Php.ini dosyasına erişiminiz yoksa , bu kodu ( $ch = curl_init();satırınızdan sonra ) eklemek benim için işe yarar:

$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);

Ardından, ca-bundle.crt dosyasını indirmeniz ve belirttiğiniz konuma kaydetmeniz yeterlidir $certificate_location.


3

Bu sorunun çok basit bir çözümü var. Bunu herhangi bir sertifika dosyası olmadan yapabilirsiniz ..

Laravel Kök Klasörüne Git -> Vender -> guzzlehttp -> guzzle -> src

Client.php dosyasını açın

$ varsayılanları bul Array. bu şekilde gözüküyor ..

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

Şimdi ana İş doğrulama anahtarının değerini değiştirmek ..

'verify'          => false,

Bundan sonra CURL İsteği için SSL Sertifikasını kontrol etmeyecektir ... Bu Çözüm benim için çalışıyor. Bu çözümü birçok araştırmadan sonra buluyorum ...


2

sunucu dağıtımı için yukarıdaki cevaplar üzerinde durulacaktır.

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

konuşlandırıldığında sunucudan ödün vermeden geliştirme ortamı için hile yapmalıdır.


Kodunuzun farklı bölümlerini farklı ortamlarda çalıştırmak iyi bir kavram gibi gelmiyor - hata ayıklamayı zorlaştırıyor
Nico Haase

2

Bunu denedim işe yarıyor

açık

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

ve bunu değiştir

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

buna

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


0

Yukarıdaki çözümlerden hiçbiri işe yaramıyorsa, XAMPP kurulumunuzu daha yeni bir sürüme güncellemeyi deneyin.

Ben php 5.5.11 ile XAMPP çalıştırıyordu, aynı tam kod işe yaramadı, ben php 5.6.28 ile XAMPP yükseltti ve yukarıdaki çözümler çalıştı.

Ayrıca sadece PHP güncellemesi işe yaramadı ya da XAMPP'nin bu sürümünde apache ve php ayarlarının bir kombinasyonu gibi görünüyor.

Umarım birine yardımcı olur.


0

Gibi bir hata var:

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

Windows makinesini kullanıyorum. Bu yüzden aşağıdaki adımları izledim.

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.

Umarım birine yardımcı olabilir


0

Yerel sistemimde böyle bir sorunla karşı karşıya kaldım, ancak canlı sunucuda değil. Ben de bu sayfada başka bir çözüm daha önce bahsetti, ama bu localhost çalışma değildi . Bu nedenle, bunun yeni bir çözüm bulmak, localhost-WAMP Server çalışıyor .

cURL Hatası #: SSL sertifikası sorunu: yerel yayıncı sertifikası alınamıyor

bazen sistem cacert.pem'inizi sürücünüzde bulamadı . böylece bunu CURL kullanacağınız kodunuzda tanımlayabilirsiniz

Bunun için OPEN-SSL kütüphanesi aktif ve diğer şeyler gibi tüm koşulları yerine getirdiğimi unutmayın.

CURL kodunu kontrol edin .

 $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);

ancak bu çözüm canlı sunucuda çalışmayabilir. cacert.pem'in mutlak yolu nedeniyle


0

Bu sorunun doğru bir çözümü var, bu sorunun temel nedenini anlamaya çalışalım. Bu sorun, uzak sunucu SSL'si, sisteminizin sertifika deposundaki kök sertifikalar kullanılarak doğrulanamadığında veya uzak SSL zincir sertifikalarıyla birlikte yüklenmediğinde ortaya çıkar. Kök ssh erişimi olan bir linux sisteminiz varsa, bu durumda sertifika deponuzu aşağıdaki komutla güncellemeyi deneyebilirsiniz:

update-ca-certificates

Hala çalışmıyorsa, sertifika deponuza uzak sunucunun kök ve geçici sertifikasını eklemeniz gerekir. Kök ve ara sertifikaları indirebilir ve / usr / local / share / ca-certificate dizinine ekleyebilir ve ardından komutu çalıştırabilirsiniz update-ca-certificates. Bu hile yapmalı. Benzer şekilde, pencereler için kök ve ara sertifikayı nasıl ekleyeceğinizi arayabilirsiniz.

Bu sorunu çözmenin diğer yolu, uzak sunucu ekibinden etki alanı kök sertifikası, ara sertifika ve kök sertifika paketi olarak ssl sertifikası eklemesini istemektir.


-4

guzzle için bunu deneyebilirsiniz:

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

guzzle / guzzle 3 üzerinde test edildi. *


1
200+ upvotes ile kabul edilen bir cevabı olan 3 yıllık bir soruyu cevaplamanın bir anlamı var mı?
treyBake

cevabım yukarıdaki olanlardan daha basit, birkaç ay boyunca 10 upvotes alacağım göreceksiniz ...
fico7489

1
Çok şüphe duyuyorum, OP'de herhangi bir namlu görmüyorum ... bu yüzden ilgisiz bir cevap. Birisi bir JavaScript sorunu için jQuery çözümü sağladığında da aynıdır. Alakasız.
treyBake

burada kullanılmadığı gerçeği değişmez. En çok kullanılan sunucu işletim sistemi olduğundan bir Windows kullanıcısına Linux çözümü önerir misiniz? Herkes Guzzle kullanmak istemiyor, ben şahsen PHP kullandığım yıllar boyunca hiç kullanmadım. Bana göre, bir HTTP isteği bunun için bir pakete ihtiyaç duymak o kadar da zor değil.
treyBake

1
tamamen farkında - sadece gerekli değil .. sadece kıvırmak için belgeleri okuyun ve hepsi kendi kendini açıklayıcı. Daha akıllı olmak değil ... soruyu doğru cevaplamakla ilgili
treyBake
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.