cURL hatası 60: SSL sertifikası: yerel yayıncı sertifikası alınamıyor


232

Yerel geliştirme ortamında WAMP kullanıyorum ve bir kredi kartı tahsil etmeye çalışıyorum ama hata mesajı alıyorum:

cURL hatası 60: SSL sertifikası sorunu: yerel yayıncı sertifikası alınamıyor

Google'da çok fazla arama yaptım ve birçok insan bu dosyayı indirmemi öneriyor: cacert.pem , bir yere koy ve php.ini dosyamda referans ver. Bu benim php.ini bölümüdür:

curl.cainfo = "C:\Windows\cacert.pem"

Yine de, sunucumu birkaç kez yeniden başlattıktan ve yolu değiştirdikten sonra bile aynı hata mesajını alıyorum.

Apache Modüllerinden WAMP kullanıyorum ve ssl_module etkin. Ve PGP uzantılarından php_curl etkin.

Yine de aynı hata mesajı. Bu neden oluyor?

Şimdi bu düzeltmeyi takip ediyorum: PHP CURL Hatası 60 SSL nasıl düzeltilir

Bu, cURL seçeneklerime bu satırları eklememi önerir:

curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, true);

CURL'uma nerede seçenekler ekleyebilirim? Görünüşe göre komut satırından değil, CLI'm "curl_setopt" komutunu bulamıyor

DÜZENLE

Bu çalıştırıyorum kodu:

public function chargeStripe()
{
    $stripe = new Stripe;
    $stripe = Stripe::make(env('STRIPE_PUBLIC_KEY'));

    $charge = $stripe->charges()->create([
        'amount'   => 2900,
        'customer' => Input::get('stripeEmail'),
        'currency' => 'EUR',
    ]);

    dd($charge);

    // echo $charge[Input::get('stripeToken')];


    return Redirect::route('step1');
}

Kodunuzla ilgili herhangi bir sorun olmadığını varsayarsak, güvenlik duvarınız olabilir. Test etmek için güvenlik duvarınızı devre dışı bırakmayı deneyin.
Waqar ul islam

burada bu soruya cevap vermedim mi? :)
Limon Monte

@limonte mümkün, projeleri değiştirmek ve muhtemelen yeni proje ile aynı sorunu yaşamak zorunda kaldı. Ağız problemine geri dönecek ve belki de aynı düzeltme. brb
LoveAndHappiness

1
Stripe'nin en son sürümünü denediniz mi? Certs
thelastshadow

1
@LoveAndHappiness bu sorunun çözümü var mı? Aynı hatayla şeritle karşılaşıyorum. Herhangi bir çözümünüz varsa lütfen bize bildirin.
Dev

Yanıtlar:


515

XAMPP kullanarak Windows üzerinde olduğunu varsayarak çalışma çözümü:

XAMPP sunucusu

  1. Diğer ortamlar için benzer
    • cacert.pem için buradan indirin ve ayıklayın (temiz bir dosya formatı / veri)

https://curl.haxx.se/docs/caextract.html

  1. Buraya aşağıdaki dizine koyun.

C: \ xampp \ php \ ekstralar \ ssl \ cacert.pem

  1. Php.ini dosyasında bu satırı bu bölüme koyun ("c: \ xampp \ php \ php.ini"):
;;;;;;;;;;;;;;;;;;;;
; php.ini Options  ;
;;;;;;;;;;;;;;;;;;;;

curl.cainfo = "C:\xampp\php\extras\ssl\cacert.pem"
  1. Web sunucunuzu / apache'nizi yeniden başlatın

  2. Sorun çözüldü!

(Referans: https://laracasts.com/discuss/channels/general-discussion/curl-error-60-ssl-certificate-problem-unable-to-get-local-issuer-certificate )


6
Bu ileti PHP sürümünüz nedeniyle geliyor. PHP 5.5 üst ise PHP 5.6 yeni özelliği nedeniyle bu hatayı geliyor. CURL kullanıyorsanız PHP 5.6 çek sertifikaları.
UWU_SANDUN

9
Cevap için teşekkürler! Her ne kadar resmi kıvırmak sayfasından cacert.pem kullanmanızı öneririm: curl.haxx.se/docs/caextract.html
dieBeiden

6
Sadece bu işe yaramazsa kimse işaret etmek istedim - Ben eğik çizgi kullandım curl.cainfo = "C:/cacert.pem"ve ayrıca işe almak için bilgisayarımı yeniden başlatmak zorunda kaldı. Sadece web sunucusunu yeniden başlatmak yeterli değildi. Umarım bu yardımcı olur:]
space_food_

1
ve uncomment unutmayın curl.cainfo(facepalm)
Edmund Sulzanok

Bir cazibe gibi çalıştı! Teşekkürler
Jack

55

Dikkat Wamp / Wordpress / windows kullanıcıları. Ben saatlerce bu sorunu vardı ve soru bile WAMP için olmasına rağmen, soru WAMP kullanıcıları için değil, XAMPP için cevap çünkü yanlış php.ini dosyasını düzenlediğim için bile doğru cevap benim için yapıyordu.

işte yaptım

Sertifika paketini indirin .

İçine koymak C:\wamp64\bin\php\your php version\extras\ssl

Dosyanın mod_ssl.soiçinde olduğundan emin olunC:\wamp64\bin\apache\apache(version)\modules

Enable mod_ssliçinde httpd.confApaçi dizinin içiC:\wamp64\bin\apache\apache2.4.27\conf

Etkin php_openssl.dlliçinde php.ini. Benim sorunum iki php.ini dosyaları vardı ve ben her ikisinde de bunu yapmak olduğunu unutmayın. İlki WAMP görev çubuğu simgenizin içine burada yerleştirilebilir.

resim açıklamasını buraya girin

diğeri ise C:\wamp64\bin\php\php(Version)

her iki php.inidosyanın konumunu bulun ve satırı bulun curl.cainfo =ve buna böyle bir yol verin

curl.cainfo = "C:\wamp64\bin\php\php(Version)\extras\ssl\cacert.pem"

Şimdi dosyaları kaydedin ve sunucunuzu yeniden başlatın ve gitmek için iyi olmalısınız


Kullanmak istediğinizi yapmaktan daha az php.ini yapmanız gerekmiyor: SAPI istemcisi olarak apache kullanıyorsanız, apache dizininde değişiklik yapın ve / veya istemcide değişiklik yapın Eğer SAPI olarak php.exe kullanmayı planlıyorsanız dir.
Fabien Haddadi

3
"Bunu her ikisinde de yapmalıyım" anahtar not. Teşekkür ederim
Jaroslav Klimčík

1
Bu Laravel 5.5 için "guzzlehttp / guzzle" ile çalışır: "^ 6.3". Wamp sunucusu 3.1.3. Php 7.1 *
Deepesh Thapa

bu çalıştı. Teşekkürler
user4906240 11:19

Wamp için cevap verdiğiniz için teşekkürler
altoids

46

Guzzle ile PHP 5.6 kullanıyorsanız, Guzzle, süreçler yerine sertifikalar için PHP kütüphanelerinin otomatik algılama özelliğini kullanmaya başladı ( ref ) . PHP değişiklikleri özetliyor burada .

PHP / Guzzle'ın Sertifikaları Nerede Aradığını Bulma

PHP'yi kullanarak nereye bakabilirsin:

 var_dump(openssl_get_cert_locations());

Sertifika Paketi Alma

OS X testi için, homebrew'u openssl yüklemek için kullanabilirsiniz brew install openssl ve sonra openssl.cafile=/usr/local/etc/openssl/cert.pemphp.ini veya Zend Server ayarlarınızda (OpenSSL altında) kullanabilirsiniz.

Bir sertifika paketi, curl web sitesindeki curl / Mozilla'dan da edinilebilir: adresinden de https://curl.haxx.se/docs/caextract.html

PHP'ye Sertifikaların Nerede Olduğunu Anlatma

Bir pakete sahip olduktan sonra, ya PHP'nin zaten baktığı yere yerleştirin (yukarıda bulduğunuz) veya openssl.cafilephp.ini'de güncelleyin . (Genel olarak /etc/php.iniveya /etc/php/7.0/cli/php.iniveya /etc/php/php.iniUnix'te.)


3
EVET. Çok sayıda insanın birden fazla sürüm numarasıyla düşürülmesinin açıkça yanlış bir yaklaşım önerdiğini gördükten sonra, bu doğru yaklaşımdır. Başkalarının kafeterya hakkındaki tavsiyelerini takip ettim ama neden hala yüklenmediğini test etme imkanım yoktu. Bu openssl_get_cert_locations () işlevi gerçekten sorunumu tanımlamak iş yaptı. Teşekkürler!
Web ve Akış

1
Sağladığınız için teşekkür ederiz openssl_get_cert_locations, hata ayıklamayı çok daha kolay hale getirdi. WAMP, apache php için konsol php'den farklı ini dosyası kullanıyor gibi görünüyor. Benim durumumda, openssl.cafile="c:/_/cacert.pem"konsol tabanlı php için eklemek zorunda kaldı . Son kez, apache üzerinden kullanırken, onu çalıştırmam gerekiyordu curl.cainfo="c:/_/cacert.pem".
psycho brm

16

Cartalyst / stripe tarafından kullanılan Guzzle, bir sunucu sertifikasını kontrol etmek için uygun bir sertifika arşivi bulmak için aşağıdakileri yapacaktır:

  1. Kontrol eğer openssl.cafilePhp.ini dosyanızda ayarlanıp ayarlanmadığını .
  2. Kontrol eğer curl.cainfoPhp.ini dosyanızda ayarlanıp ayarlanmadığını .
  3. Kontrol eğer /etc/pki/tls/certs/ca-bundle.crt olmadığını (Red Hat, CentOS, Fedora; ca-sertifika paketi tarafından sağlanır)
  4. Kontrol eğer /etc/ssl/certs/ca-certificates.crt olmadığını (Ubuntu, Debian; ca-certificate paketi tarafından sağlanır)
  5. Kontrol eğer /usr/local/share/certs/ca-root-nss.crtVar olmadığını (FreeBSD; ca_root_nss paketi tarafından sağlanır)
  6. Kontrol edin /usr/local/etc/openssl/cert.pem(OS X; homebrew tarafından sağlandı)
  7. Var olup C:\windows\system32\curl-ca-bundle.crtolmadığını kontrol edin (Windows)
  8. Var olup C:\windows\curl-ca-bundle.crtolmadığını kontrol edin (Windows)

İlk iki ayarın değerlerinin basit bir test yaparak düzgün bir şekilde tanımlandığından emin olmak istersiniz:

echo "openssl.cafile: ", ini_get('openssl.cafile'), "\n";
echo "curl.cainfo: ", ini_get('curl.cainfo'), "\n";

Alternatif olarak, dosyayı # 7 veya # 8 ile belirtilen konumlara yazmaya çalışın.


13

Eğer php.ini dosyasını değiştiremiyorsanız, cacert.pem dosyasını şu şekilde koddan da işaret edebilirsiniz:

$http = new GuzzleHttp\Client(['verify' => '/path/to/cacert.pem']);
$client = new Google_Client();
$client->setHttpClient($http);

8

Ne yaptım var_dump(openssl_get_cert_locations()); die;bana benim yerel php kullanıyordu varsayılanlar hakkında bilgi veren herhangi bir php script kullanmak oldu:

array (size=8)
  'default_cert_file' => string 'c:/openssl-1.0.1c/ssl/cert.pem' (length=30)
  'default_cert_file_env' => string 'SSL_CERT_FILE' (length=13)
  'default_cert_dir' => string 'c:/openssl-1.0.1c/ssl/certs' (length=27)
  'default_cert_dir_env' => string 'SSL_CERT_DIR' (length=12)
  'default_private_dir' => string 'c:/openssl-1.0.1c/ssl/private' (length=29)
  'default_default_cert_area' => string 'c:/openssl-1.0.1c/ssl' (length=21)
  'ini_cafile' => string 'E:\xampp\php\extras\ssl\cacert.pem' (length=34)
  'ini_capath' => string '' (length=0)

Fark edebileceğiniz gibi, ini_cafile veya ini seçeneğini curl.cainfo ayarladım. Ama benim durumumda, curl, var olmayan "default_cert_file" kullanmaya çalışacaktı.

Dosyayı https://curl.haxx.se/ca/cacert.pem adresinden "default_cert_file" (c: /openssl-1.0.1c/ssl/cert.pem) konumuna kopyaladım ve edinebildim çalışmak.

Bu benim için tek çözümdü.


Benzer bir sorunum var ve konumum c: /usr/local/ssl/cert.pem gibi bir şey ama bu konum mevcut değil, ne olabilir mi, ayrıca aynı proje mac makinesindeki coluge tarafından da kullanılabilir Bu nedenle, her şeyi denedim. mevcut olmayan yerde.
AbdulMueed

Klasörleri oluşturmayı ve sertifikayı belirttiğiniz yola koymayı deneyebilirsiniz?
George Donev

7

Bir Guzzle (5) komut dosyası bir ana bilgisayara SSL üzerinden bağlanmaya çalıştığında, bu sorun mavi bir gün ortaya çıktı. Elbette, Guzzle / Curl'da VERIFY seçeneğini devre dışı bırakabilirim, ancak bu açıkça doğru yol değil.

Burada listelenen her şeyi denedim ve benzer iş parçacıkları, sonra sonunda bağlanmaya çalıştığım etki alanına karşı test etmek için openssl ile terminal gitti:

openssl s_client -connect example.com:443 

... ve ilk birkaç satırı aldı:

CONNECTED(00000003)
depth=0 CN = example.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = example.com
verify error:num=21:unable to verify the first certificate
verify return:1 

... diğer hedefleri denerken her şey yolunda giderken (ör: google.com vb.)

Bu, bağlanmaya çalıştığım alanla iletişim kurmamı istedi ve gerçekten THEIR END'de bir sorunla karşılaştılar. Çözüldü ve senaryom tekrar çalışmaya başladı.

Yani ... saçınızı çekiyorsanız, openssl'e bir şans verin ve bağlanmaya çalıştığınız konumdan gelen yanıtla ilgili bir şey olup olmadığını görün. Belki de sorun bazen 'yerel' değildir.


6

Benim için işe yarayan bir çözüm buldum. Son guzzle sürümünden ~ 4.0 sürümüne geçtim ve işe yaradı.

Composer.json dosyasına "guzzlehttp / guzzle" ekleyin: "~ 4.0"

Umarım birine yardımcı olur


Bu, herhangi bir sürüm 5/6 özelliğini kullanmanızı da engelleyecektir. Bunun yerine, bir param dizisinde doğrulama işlevini false olarak ayarlayın (istek parametresinin 3. parametresi): $ client-> request ('GET', '/', ['verify' => false]);
S ..

3

php.iniDosyayı doğrudan Pencere Gezgini tarafından açtığınızdan emin olun . (benim durumumda:) C:\DevPrograms\wamp64\bin\php\php5.6.25.

php.iniSistem Tepsisindeki Wamp / Xamp simgesinin menüsünde bulunan kısayolu kullanmayın . Bu kısayol bu durumda çalışmaz.

Ardından şunu düzenleyin php.ini:

curl.cainfo ="C:/DevPrograms/wamp64/bin/php/cacert.pem" 

ve

openssl.cafile="C:/DevPrograms/wamp64/bin/php/cacert.pem"

Kaydettikten sonra php.inideğil wamp simgesinde "Yeniden tüm Hizmetleri" gerek veya yakın / yeniden açık CMD yoktur.


2

Denedin mi..

curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);

Güvenilir bir kaynak tüketiyorsanız, SSL sertifikasını doğrulamanız gerekmez.


2

Bu sorunu benim için çözmek için çok zaman harcadım.

PHP sürüm 5.5 vardı ve 5.6'ya yükseltmem gerekiyordu.

<5.6 sürümünde Guzzle kendi cacert.pem dosyasını kullanacaktır, ancak PHP'nin daha yüksek sürümlerinde sistemin cacert.pem dosyasını kullanacaktır.

Ayrıca https://curl.haxx.se/docs/caextract.html dosyasını da indirdim ve php.ini'de ayarladım.

Yanıt, Bulmacalar StreamHandler.php dosyasında bulundu https://github.com/guzzle/guzzle/blob/0773d442aa96baf19d7195f14ba6e9c2da11f8ed/src/Handler/StreamHandler.php#L437

        // PHP 5.6 or greater will find the system cert by default. When
        // < 5.6, use the Guzzle bundled cacert.

2

Bütün cevaplar doğru ; ama en önemli şey doğru php.ini dosyasını bulmak zorunda. cmd bu komutu kontrol edin "php --ini" doğru php.ini dosyasını bulmak için doğru cevap değil .

eğer düzenlerseniz

curl.cainfo ="PATH/cacert.pem"

ve kontrol et

var_dump(openssl_get_cert_locations()); 

sonra curl.cainfo bir değere sahip olmalıdır. değilse doğru php.ini dosyası değil;

* Wamp / bin veya xxamp / bin veya kullandığınız herhangi bir sunucuda * .ini aramanızı ve bunları tek tek değiştirip kontrol etmenizi öneririm. *


1

Ben sadece aynı sorunu kullanan Laravel 4 php çerçeve ile yaşadım guzzlehttp/guzzle besteci paketini . Herhangi bir nedenle, mailgun için SSL sertifikası aniden doğrulamayı durdurdu ve aynı "hata 60" mesajını aldım.

Benim gibi, erişime sahip olmayan bir barındırma kullanıyorsanız php.ini, diğer çözümler mümkün değildir. Her durumda, Guzzle, büyük olasılıkla php.inietkileri geçersiz kılacak bu başlatma koduna sahiptir :

// vendor/guzzlehttp/guzzle/src/Client.php
    $settings = [
        'allow_redirects' => true,
        'exceptions'      => true,
        'decode_content'  => true,
        'verify'          => __DIR__ . '/cacert.pem'
    ];

Burada Guzzle, cURL ortamının sağladığı dosyayı kullanmak yerine, muhtemelen artık güncel olmayan kendi dahili cacert.pem dosyasının kullanımını zorlar . Bu satırı değiştirmek (en azından Linux'ta) Guzzle'ı cURL'nin varsayılan SSL doğrulama mantığını kullanacak şekilde yapılandırdı ve sorunumu düzeltti:

        'verify'          => true

falseSSL bağlantınızın güvenliğini önemsemiyorsanız bunu da ayarlayabilirsiniz , ancak bu iyi bir çözüm değildir.

İçindeki dosyaların vendorkurcalanması amaçlanmadığından , Guzzle istemcisini kullanımda yapılandırmak daha iyi bir çözüm olacaktır , ancak Laravel 4'te bunu yapmak çok zordu.

Umarım bu birkaç saat hata ayıklamayı kurtarır ...


1

Bu bir uç durum olabilir, ancak benim durumumda sorun istemci conf (zaten curl.cainfoyapılandırmıştı php.ini) değil, uzak sunucu düzgün yapılandırılmamıştı:

Zincirde herhangi bir ara sertifika göndermedi . Chrome kullanarak siteye göz atarken hata olmadı, ancak PHP ile aşağıdaki hatayı aldım.

cURL hatası 60

Ara Sertifikaları uzak web sunucusu yapılandırmasına dahil ettikten sonra çalıştı.

Bu siteyi, sunucunuzun SSL yapılandırmasını kontrol etmek için kullanabilirsiniz:

https://whatsmychaincert.com/


1

Ben çalıştırdığınızda 'var_dump(php_ini_loaded_file());' benim sayfasında bu çıktıyı almak 'C:\Development\bin\apache\apache2.4.33\bin\php.ini' (length=50)'

ve benim sertifika dosyasını yüklemek için php almak için bu yolda php.ini dosyasını düzenler zorunda kaldı 'C:\Development\bin\apache\apache2.4.33\bin\php.ini' ve eklemek openssl.cafile="C:/Development/bin/php/php7.2.4/extras/ssl/cacert.pem"ı indirdiğini nerede ve benim sertifika dosyasını yerleştirin https://curl.haxx.se/docs/caextract.html

drupal 8, wamp ve php7.2.4 kullanarak Windows 10'dayım


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 bir yolu, uzak sunucu ekibinden etki alanı kök sertifikası, ara sertifika ve kök sertifika paketi olarak ssl sertifikası eklemesini istemektir.


-1

Windows'u kullanırken yol ayırıcısının '\' (ve Linux'ta '/') olduğunu düşünüyorum. Sabiti kullanmayı deneyin DIRECTORY_SEPARATOR. Kodunuz daha taşınabilir olacaktır.

Deneyin:

curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . DIRECTORY_SEPARATOR . 'cacert.pem');

EDIT: ve tam yolu yazın. Göreli yollar ile bazı sorunlar vardı (belki curl başka bir temel dizinden yürütülür?)


1
Bu fark yaratmaz, çünkü söz konusu Stripe kütüphanesini kullandığınızda gerçek cURL ayarları sizin kontrolünüz dışındadır.
Ja͢ck

-1

WAMP kullanıyorsanız, Apache için php.ini dosyasına (varsayılan php.ini dosyasının yanında) sertifika satırını da eklemeniz gerekir:

[curl]
curl.cainfo = C:\your_location\cacert.pem

php5.3 + için çalışır


Evet! Hem apache hem de php sürüm php.ini dosyalarını düzenlemeye dikkat edin. WAMP kullanıcıları için bu cevap sorunumu çözen tek
yanıttı
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.