błąd cURL 60: certyfikat SSL: nie można uzyskać lokalnego certyfikatu wystawcy

Używam WAMP na lokalnym środowisku deweloperskim i próbuję naładować kartę kredytową, ale otrzymuję komunikat o błędzie:

Błąd CURL 60: problem z certyfikatem SSL: nie można uzyskać lokalnego certyfikatu wystawcy

Szukałem dużo w Google i wiele osób sugeruje, że mogę pobrać ten plik: cacert.pem, umieść go gdzieś i odwołaj się do niego w moim php.ini. To jest część w moim php.ini:

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

Jednak, nawet po kilkukrotnym restarcie serwera i zmieniając ścieżkę, dostaję ten sam komunikat o błędzie.

Używam WAMP z modułów Apache i mam włączony ssl_module. A z rozszerzeń PGP mam włączone php_curl.

Nadal ten sam komunikat o błędzie. Dlaczego tak się dzieje?

Teraz podążam za tą poprawką: Jak naprawić błąd PHP CURL 60 SSL

Co sugeruje, że dodaję te linie do moich opcji cURL:

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

Gdzie mogę dodać opcje do mojego cURL? Najwyraźniej nie przez linię poleceń, ponieważ mój CLI nie znajduje polecenia "curl_setopt"

EDIT

Oto kod, który uruchamiam:

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');
}
Author: Sᴀᴍ Onᴇᴌᴀ, 2015-04-23

16 answers

Rozwiązanie robocze:

  • zakładając w windows

XAMPP server

Podobne do innych środowisk - Pobierz i wyodrębnij dla cacert.pem here (a clean file format/data)

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

  • put it here

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

  • w Twoim php.ini umieściła ten wiersz w tym dziale ("c:\xampp\php\php.ini"): {]}
;;;;;;;;;;;;;;;;;;;;
; php.ini Options  ;
;;;;;;;;;;;;;;;;;;;;

curl.cainfo = "C:\xampp\php\extras\ssl\cacert.pem"
  • Uruchom ponownie serwer WWW / apache
Problem rozwiązany!

(źródło: https://laracasts.com/discuss/channels/general-discussion/curl-error-60-ssl-certificate-problem-unable-to-get-local-issuer-certificate)

 381
Author: Dung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-28 17:47:12

Jeśli używasz PHP 5.6 z Guzzle, Guzzle przełączył się na korzystanie z bibliotek PHP autodetect dla certyfikatów zamiast procesu (ref ). PHP przedstawia zmiany tutaj .

Dowiedzieć się, gdzie PHP / Guzzle Szuka certyfikatów

Możesz zrzucić gdzie PHP szuka używając:

 var_dump(openssl_get_cert_locations());

Uzyskanie pakietu certyfikatu

Do testowania OS X, możesz użyć homebrew, aby zainstalować openssl brew install openssl, a następnie użyć openssl.cafile=/usr/local/etc/openssl/cert.pem w php.ini czy Zend Ustawienia serwera (pod OpenSSL).

Pakiet certyfikatów jest również dostępny w curl / Mozilla na stronie curl: https://curl.haxx.se/docs/caextract.html

Mówienie PHP gdzie są certyfikaty

Gdy już masz pakiet, umieść go tam, gdzie PHP już szuka (o czym dowiedziałeś się powyżej) lub zaktualizuj openssl.cafile w php.ini. (Ogólnie, /etc/php.ini lub /etc/php/7.0/cli/php.ini lub /etc/php/php.ini na Unixie.)

 29
Author: Loren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-04 20:22:15

Uwaga użytkownicy Wamp/Wordpress / windows. Miałem ten problem przez wiele godzin i nawet poprawna odpowiedź nie robiła tego za mnie, ponieważ edytowałem złe php.plik ini, ponieważ na pytanie odpowiadało XAMPP, a nie dla użytkowników WAMP, mimo że pytanie dotyczyło WAMP.

Oto co zrobiłem

Pobierz pakiet certyfikatów .

Włóż do środka C:\wamp64\bin\php\your php version\extras\ssl

Upewnij się, że plik mod_ssl.so znajduje się wewnątrz C:\wamp64\bin\apache\apache(version)\modules

Włącz mod_ssl w httpd.conf wewnątrz katalogu Apache C:\wamp64\bin\apache\apache2.4.27\conf

WŁĄCZ php_openssl.dll W php.ini. Pamiętaj, że mój problem polegał na tym, że miałem dwa php.pliki ini i muszę to zrobić w obu. Pierwszy z nich może być umieszczony wewnątrz Ikony paska zadań WAMP tutaj.

Tutaj wpisz opis obrazka

A drugi znajduje się w C:\wamp64\bin\php\php(Version)

Znajdź lokalizację dla obu plików php.ini i znajdź linię curl.cainfo = i podaj jej ścieżkę jak ta

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

Teraz zapisz pliki i uruchom ponownie serwer and you should be good to go

 14
Author: Rami Nour,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-02 12:44:20

Guzzle, który jest używany przez cartalyst / stripe, wykona następujące czynności, aby znaleźć odpowiednie archiwum certyfikatów, aby sprawdzić certyfikat serwera:

  1. sprawdź czy openssl.cafile jest ustawione w Twoim php.plik ini.
  2. sprawdź czy curl.cainfo jest ustawione w Twoim php.plik ini.
  3. sprawdź czy /etc/pki/tls/certs/ca-bundle.crt istnieje (Red Hat, CentOS, Fedora; dostarczane przez pakiet CA-certificates)
  4. sprawdź czy /etc/ssl/certs/ca-certificates.crt istnieje (Ubuntu, Debian; dostarczane przez pakiet CA-certificates)
  5. sprawdź, czy /usr/local/share/certs/ca-root-nss.crt exists (FreeBSD; dostarczone przez pakiet ca_root_nss)
  6. sprawdź czy /usr/local/etc/openssl/cert.pem (OS X; dostarczone przez homebrew)
  7. sprawdź czy C:\windows\system32\curl-ca-bundle.crt istnieje (Windows)
  8. sprawdź czy C:\windows\curl-ca-bundle.crt istnieje (Windows)

Będziesz chciał się upewnić, że wartości dla pierwszych dwóch ustawień są poprawnie zdefiniowane, wykonując prosty test:

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

Alternatywnie, spróbuj zapisać plik w miejscach wskazanych przez #7 lub # 8.

 10
Author: Ja͢ck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-10 10:29:47

Jeśli nie możesz zmienić php.ini można również wskazać na cacert.plik pem z kodu takiego:

$http = new GuzzleHttp\Client(['verify' => '/path/to/cacert.pem']);
$client = new Google_Client();
$client->setHttpClient($http);
 10
Author: mvandillen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-08 13:28:07

Znalazłem rozwiązanie, które działa dla mnie. Zredukowałem z najnowszej wersji do wersji ~4.0 i zadziałało.

In composer.json dodaj "guzzlehttp/guzzle": "~4.0 "

Hope it helps someone

 5
Author: Iruku Kagika,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-27 13:43:13

To, co zrobiłem, to użycie var_dump(openssl_get_cert_locations()); die; w dowolnym skrypcie php, co dało mi informacje o domyślnych ustawieniach, których używał mój lokalny php:

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)

Jak można zauważyć, ustawiłem ini_cafile lub opcję ini curl.cainfo. Ale w moim przypadku curl spróbowałby użyć" default_cert_file", który nie istnieje.

Skopiowałem Plik z https://curl.haxx.se/ca/cacert.pem do lokalizacji dla " default_cert_file "(c:/openssl-1.0.1c/ssl/cert.pem) i udało mi się go uruchomić.

To było dla mnie jedyne rozwiązanie.
 5
Author: George Donev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-08 21:13:16

Pewnego dnia pojawił się ten problem, gdy skrypt Guzzle(5) próbował połączyć się z hostem przez SSL. Oczywiście, mógłbym wyłączyć opcję VERIFY w Guzzle/Curl, ale to zdecydowanie nie jest prawidłowy sposób.

Próbowałem wszystkiego wymienionego tutaj i w podobnych wątkach, a następnie w końcu poszedłem do terminala z openssl, aby przetestować domenę, z którą próbowałem się połączyć:

openssl s_client -connect example.com:443 

... i otrzymał kilka pierwszych linijek oznaczenie:

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 

... podczas gdy wszystko działało dobrze podczas próbowania innych miejsc (tj. google.com, etc)

To skłoniło mnie do skontaktowania się z domeną, z którą próbowałem się połączyć, i rzeczywiście, mieli problem, który się wkradł. To zostało rozwiązane i mój scenariusz wrócił do pracy.

Więc... jeśli wyrywasz włosy, daj szansę openssl i sprawdź, czy jest coś z odpowiedzią z miejsca, które próbujesz połączyć. Może problem czasami nie jest tak "lokalny".
 3
Author: Daydream Nation,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-12 19:42:47

Właśnie doświadczyłem tego samego problemu z frameworkiem php Laravel 4, który używa pakietu composer guzzlehttp/guzzle. Z jakiegoś powodu certyfikat SSL dla mailgun przestał się nagle sprawdzać i dostałem ten sam komunikat "Błąd 60".

Jeśli, podobnie jak ja, korzystasz z hostingu współdzielonego bez dostępu do php.ini, inne rozwiązania nie są możliwe. W każdym razie, Guzzle ma ten klient inicjujący kod, który najprawdopodobniej anuluje efekty php.ini:
// vendor/guzzlehttp/guzzle/src/Client.php
    $settings = [
        'allow_redirects' => true,
        'exceptions'      => true,
        'decode_content'  => true,
        'verify'          => __DIR__ . '/cacert.pem'
    ];

Tutaj Guzzle wymusza użycie własny wewnętrzny cacert.plik pem, który prawdopodobnie jest już nieaktualny, zamiast używać tego dostarczonego przez środowisko curla. Zmiana tej linii (przynajmniej na Linuksie) konfiguruje Guzzle do używania domyślnej logiki weryfikacji SSL curla i naprawił mój problem:

        'verify'          => true

Możesz również ustawić to na false, jeśli nie zależy ci na bezpieczeństwie połączenia SSL, ale to nie jest dobre rozwiązanie.

Ponieważ pliki w vendor nie są przeznaczone do manipulacji, lepszym rozwiązaniem byłoby być do skonfigurować klienta Guzzle przy użyciu, ale to było zbyt trudne do zrobienia w Laravel 4.

Mam nadzieję, że zaoszczędzi to komuś kilka godzin debugowania...

 1
Author: bernie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-25 07:53:21

To może być przypadek edge, ale w moim przypadku problemem nie był client conf (miałem już curl.cainfo skonfigurowany w php.ini), ale raczej zdalny serwer nie jest poprawnie skonfigurowany:

Nie wysyłał żadnych pośrednich Cert w łańcuchu. Nie było błędu przeglądania witryny za pomocą Chrome, ale w PHP dostałem następujący błąd.

Błąd CURL 60

Po włączeniu Certów pośrednich do zdalnego konfiguracja serwera zadziałała.

Możesz użyć tej strony, aby sprawdzić konfigurację SSL twojego serwera:

Https://whatsmychaincert.com/

 1
Author: Tobias K.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-01 13:59:58

Spędziłem zbyt dużo czasu, aby rozwiązać ten problem dla mnie.

Miałem PHP w wersji 5.5 i musiałem uaktualnić do 5.6.

W wersjach

Ściągnąłem też plik stąd https://curl.haxx.se/docs/caextract.html i ustaw go w php.ini.

ODPOWIEDŹ znaleziona w Guzzles StreamHandler.plik php 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.
 1
Author: Marko Milivojevic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-31 08:40:37

Próbowałeś..

curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);

Jeśli korzystasz z zaufanego źródła, prawdopodobnie nie musisz sprawdzać certyfikatu SSL.

 0
Author: Mike Miller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-10 09:51:06

Upewnij się, że plik php.ini otwierasz bezpośrednio w Eksploratorze okien. (w moim przypadku: C:\DevPrograms\wamp64\bin\php\php5.6.25).

Nie używaj skrótu do php.ini w menu ikony Wamp / Xamp w tacce systemowej. Ten skrót nie działa w tym przypadku.

Następnie Edytuj to php.ini:

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

I

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

Po zapisaniu php.ini nie musisz "restartować wszystkich usług" w ikonie Wamp lub zamykać / ponownie otwierać CMD.

 0
Author: Quang Nguyen Tri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-26 22:07:27

Kiedy uciekam 'var_dump(php_ini_loaded_file());' I get this output on my page 'C:\Development\bin\apache\apache2.4.33\bin\php.ini' (length=50)'

I aby PHP załadowało mój plik cert musiałem edytować php.ini in this path 'C:\Development\bin\apache\apache2.4.33\bin\php.ini' i dodać openssl.cafile="C:/Development/bin/php/php7.2.4/extras/ssl/cacert.pem" gdzie Pobrałem i umieścić mój plik cert z https://curl.haxx.se/docs/caextract.html

[[4]}Am na windows 10, używając drupal 8, wamp i php7.2.4
 0
Author: Nicholas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-26 10:20:06

Ponieważ używasz Windows, myślę, że separatorem ścieżki jest ' \ '(i '/' na Linuksie). Spróbuj użyć stałej DIRECTORY_SEPARATOR. Twój kod będzie bardziej przenośny.

Try:

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

EDIT: i zapisz pełną ścieżkę. Miałem problemy ze ścieżkami względnymi (być może curl jest wykonywany z innego katalogu bazowego?)

 -1
Author: C Würtz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-10 09:46:50

Jeśli używasz WAMP powinieneś również dodać linię certyfikatu w php.ini dla Apache (oprócz domyślnego php.plik ini):

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

Działa dla php5.3 +

 -1
Author: bob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-29 09:14:18