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');
}
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)
- 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
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.)
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.
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
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:
- sprawdź czy
openssl.cafile
jest ustawione w Twoim php.plik ini. - sprawdź czy
curl.cainfo
jest ustawione w Twoim php.plik ini. - sprawdź czy
/etc/pki/tls/certs/ca-bundle.crt
istnieje (Red Hat, CentOS, Fedora; dostarczane przez pakiet CA-certificates) - sprawdź czy
/etc/ssl/certs/ca-certificates.crt
istnieje (Ubuntu, Debian; dostarczane przez pakiet CA-certificates) - sprawdź, czy
/usr/local/share/certs/ca-root-nss.crt
exists (FreeBSD; dostarczone przez pakiet ca_root_nss) - sprawdź czy
/usr/local/etc/openssl/cert.pem
(OS X; dostarczone przez homebrew) - sprawdź czy
C:\windows\system32\curl-ca-bundle.crt
istnieje (Windows) - 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.
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);
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
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.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".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".
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...
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: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.
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.
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.
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
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?)
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 +
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