Korzystam z WAMP w lokalnym środowisku programistycznym i próbuję obciążyć kartę kredytową, ale pojawia się komunikat o błędzie:
błąd cURL 60: Problem z certyfikatem SSL: nie można uzyskać certyfikatu lokalnego wystawcy
Dużo szukałem w Google i wiele osób sugeruje, żebym pobrał ten plik: cacert.pem , umieściłem go gdzieś i odsyłam do niego w php.ini. To jest część mojego php.ini:
curl.cainfo = "C:\Windows\cacert.pem"
Jednak nawet po kilkukrotnym ponownym uruchomieniu serwera i zmianie ścieżki pojawia się ten sam komunikat o błędzie.
Używam WAMP z modułów Apache i mam włączony moduł ssl_module. A z rozszerzeń PGP mam włączone php_curl.
Nadal ten sam komunikat o błędzie. Dlaczego tak się dzieje?
Teraz śledzę tę poprawkę: Jak naprawić błąd PHP CURL 60 SSL
Co sugeruje, że dodałem 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 za pośrednictwem wiersza polecenia, ponieważ mój CLI nie znajduje polecenia „curl_setopt”
EDYTOWAĆ
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');
}
Odpowiedzi:
Działające rozwiązanie zakładające, że masz system Windows za pomocą XAMPP:
Uruchom ponownie serwer / apache
Problem rozwiązany!
(Odwołanie: https://laracasts.com/discuss/channels/general-discussion/curl-error-60-ssl-certificate-problem-unable-to-get-local-issuer-certificate )
źródło
curl.cainfo = "C:/cacert.pem"
i musiałem zrestartować komputer, aby go uruchomić. Ponowne uruchomienie serwera WWW nie wystarczyło. Mam nadzieję, że to pomaga:]curl.cainfo
(facepalm)Uwaga użytkownicy Wamp / Wordpress / Windows. Miałem ten problem przez wiele godzin i nawet poprawna odpowiedź nie robiła tego dla mnie, ponieważ edytowałem niewłaściwy plik php.ini, ponieważ pytanie zostało udzielone XAMPP, a nie użytkownikom WAMP, chociaż pytanie dotyczyło WAMP.
oto co zrobiłem
Pobierz pakiet certyfikatów.
Włóż to do środka
C:\wamp64\bin\php\your php version\extras\ssl
Upewnij się, że plik
mod_ssl.so
jest w środkuC:\wamp64\bin\apache\apache(version)\modules
Włącz
mod_ssl
whttpd.conf
katalogu ApacheC:\wamp64\bin\apache\apache2.4.27\conf
Włącz
php_openssl.dll
wphp.ini
. Pamiętaj, że moim problemem było to, że miałem dwa pliki php.ini i muszę to zrobić w obu z nich. Pierwszy z nich można znaleźć wewnątrz ikony paska zadań WAMP tutaj.a drugi znajduje się w
C:\wamp64\bin\php\php(Version)
znajdź lokalizację obu
php.ini
plików i znajdź linięcurl.cainfo =
i podaj jej ścieżkę w ten sposóbcurl.cainfo = "C:\wamp64\bin\php\php(Version)\extras\ssl\cacert.pem"
Teraz zapisz pliki i uruchom ponownie serwer, a powinieneś być gotowy
źródło
Jeśli używasz PHP 5.6 z Guzzle, Guzzle przeszedł na używanie bibliotek PHP do automatycznego wykrywania certyfikatów, a nie do procesu ( ref ). PHP opisuje zmiany tutaj .
Dowiedz się, gdzie PHP / Guzzle szuka certyfikatów
Możesz zrzucić, gdzie szuka PHP, używając:
Uzyskiwanie pakietu certyfikatu
Do testowania OS X możesz użyć homebrew, aby zainstalować openssl,
brew install openssl
a następnie użyć goopenssl.cafile=/usr/local/etc/openssl/cert.pem
w ustawieniach php.ini lub Zend Server (pod OpenSSL).Pakiet certyfikatów jest również dostępny w curl / Mozilla na stronie curl: https://curl.haxx.se/docs/caextract.html
Informowanie PHP, gdzie znajdują się certyfikaty
Kiedy już masz pakiet, umieść go w miejscu, w którym PHP już szuka (czego 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
czy/etc/php/php.ini
na Unix).źródło
openssl_get_cert_locations
, znacznie ułatwiło debugowanie. Wygląda na to, że WAMP używa innego pliku ini dla apache php niż dla php konsoli. W moim przypadku musiałem dodaćopenssl.cafile="c:/_/cacert.pem"
php na konsolę. Ostatnim razem, kiedy korzystałem z niego przez apache, musiałemcurl.cainfo="c:/_/cacert.pem"
go uruchomić .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 względem:
openssl.cafile
jest ustawiony w pliku php.ini.curl.cainfo
jest ustawiony w pliku php.ini./etc/pki/tls/certs/ca-bundle.crt
istnieje (Red Hat, CentOS, Fedora; dostarczone przez pakiet ca-certyfikatów)/etc/ssl/certs/ca-certificates.crt
istnieje (Ubuntu, Debian; dostarczone przez pakiet ca-certyfikatów)/usr/local/share/certs/ca-root-nss.crt
istnieje (FreeBSD; dostarczone przez pakiet ca_root_nss)/usr/local/etc/openssl/cert.pem
(OS X; dostarczone przez homebrew)C:\windows\system32\curl-ca-bundle.crt
istnieje (Windows)C:\windows\curl-ca-bundle.crt
istnieje (Windows)Aby upewnić się, że wartości dla pierwszych dwóch ustawień są poprawnie zdefiniowane, wykonaj prosty test:
Alternatywnie spróbuj zapisać plik w lokalizacjach wskazanych przez # 7 lub # 8.
źródło
Jeśli nie możesz zmienić php.ini, możesz również wskazać plik cacert.pem z kodu w następujący sposób:
źródło
Zrobiłem to
var_dump(openssl_get_cert_locations()); die;
w dowolnym skrypcie php, który dostarczył mi informacji o domyślnych ustawieniach, których używał mój lokalny php:Jak można zauważyć, ustawiłem opcję ini_cafile lub opcję ini curl.cainfo. Ale w moim przypadku curl próbowałby użyć „default_cert_file”, który nie istniał.
Skopiowałem plik z https://curl.haxx.se/ca/cacert.pem do lokalizacji dla pliku „default_cert_file” (c: /openssl-1.0.1c/ssl/cert.pem) i udało mi się go zdobyć pracować.
To było dla mnie jedyne rozwiązanie.
źródło
Kiedyś ten problem pojawił się nieoczekiwany, gdy skrypt Guzzle (5) próbował połączyć się z hostem przez SSL. Jasne, mógłbym wyłączyć opcję WERYFIKUJ w Guzzle / Curl, ale najwyraźniej nie jest to właściwa droga.
Próbowałem wszystkiego wymienionego tutaj i w podobnych wątkach, a potem ostatecznie poszedłem do terminalu z openssl, aby przetestować domenę, z którą próbowałem się połączyć:
... i otrzymałem kilka pierwszych wierszy wskazujących:
... podczas gdy wszystko działało dobrze podczas wypróbowywania innych miejsc docelowych (np. google.com itp.)
To skłoniło mnie do skontaktowania się z domeną, z którą próbowałem się połączyć, i rzeczywiście mieli problem z ICH KONIEC, który się podkradł. Zostało to rozwiązane i mój skrypt wrócił do działania.
Więc ... jeśli wyciągasz włosy, daj opensl szansę i sprawdź, czy coś jest nie tak z odpowiedzią z miejsca, z którym próbujesz się połączyć. Może czasami problem nie jest tak „lokalny”.
źródło
Znalazłem rozwiązanie, które działało dla mnie. Zmieniłem wersję z najnowszego żonglera na wersję ~ 4.0 i działało.
W pliku composer.json dodaj „guzzlehttp / guzzle”: „~ 4.0”
Mam nadzieję, że to komuś pomoże
źródło
Pamiętaj, aby otworzyć
php.ini
plik bezpośrednio w Eksploratorze Windows. (w moim przypadkuC:\DevPrograms\wamp64\bin\php\php5.6.25
:).Nie używaj skrótu do
php.ini
w menu ikony Wamp / Xamp na pasku zadań. Ten skrót nie działa w tym przypadku.Następnie edytuj to
php.ini
:i
Po zapisaniu
php.ini
nie trzeba „ponownie uruchamiać wszystkich usług” w ikonie Wamp ani zamykać / ponownie otwierać CMD.źródło
Czy próbowałeś..
Jeśli korzystasz z zaufanego źródła, prawdopodobnie nie musisz weryfikować certyfikatu SSL.
źródło
Spędziłem zbyt dużo czasu, aby rozwiązać ten problem.
Miałem PHP w wersji 5.5 i musiałem zaktualizować do wersji 5.6.
W wersjach <5.6 Guzzle użyje własnego pliku cacert.pem, ale w wyższych wersjach PHP użyje systemowego pliku cacert.pem.
Pobrałem również plik stąd https://curl.haxx.se/docs/caextract.html i ustawiłem go w php.ini.
Odpowiedź znaleziona w pliku Guzzles StreamHandler.php https://github.com/guzzle/guzzle/blob/0773d442aa96baf19d7195f14ba6e9c2da11f8ed/src/Handler/StreamHandler.php#L437
źródło
Wszystkie odpowiedzi są poprawne; ale najważniejsze jest to, że musisz znaleźć odpowiedni plik php.ini. zaznacz to polecenie w cmd „php --ini” nie jest właściwą odpowiedzią na znalezienie właściwego pliku php.ini.
jeśli edytujesz
i zaznacz
następnie curl.cainfo powinien mieć wartość. jeśli nie, to nie jest właściwy plik php.ini;
* Polecam przeszukać * .ini w wamp / bin lub xxamp / bin lub dowolnym serwerze, z którego korzystasz i zmieniać je jeden po drugim i sprawdzać. *
źródło
Właśnie spotkałem ten sam problem z frameworkiem Laravel 4 php, który korzysta z
guzzlehttp/guzzle
pakietu kompozytora. Z jakiegoś powodu certyfikat SSL dla pistoletu pocztowego nagle przestał się sprawdzać i otrzymałem ten sam komunikat „błąd 60”.Jeśli, podobnie jak ja, korzystasz z hostingu współdzielonego bez dostępu
php.ini
, inne rozwiązania nie są możliwe. W każdym razie Guzzle ma tego klienta inicjującego kod, który najprawdopodobniej zniweczyphp.ini
efekty:Tutaj Guzzle wymusza użycie własnego wewnętrznego pliku cacert.pem, który prawdopodobnie jest już nieaktualny, zamiast korzystania z pliku dostarczanego przez środowisko cURL . Zmiana tej linii (przynajmniej w Linuksie) konfiguruje Guzzle do korzystania z domyślnej logiki weryfikacji SSL cURL i naprawiła mój problem:
Możesz to również ustawić,
false
jeśli nie dbasz o bezpieczeństwo połączenia SSL, ale to nie jest dobre rozwiązanie.Ponieważ pliki w
vendor
nich nie są przeznaczone do manipulowania, lepszym rozwiązaniem byłoby skonfigurowanie klienta Guzzle przy użyciu, ale było to zbyt trudne w Laravel 4.Mam nadzieję, że zaoszczędzi to komuś innemu kilka godzin debugowania ...
źródło
Może to być przypadek skrajny, ale w moim przypadku problemem nie była konfiguracja klienta (już
curl.cainfo
skonfigurowałemphp.ini
), ale raczej niepoprawna konfiguracja zdalnego serwera:Nie wysłał żadnych pośrednich certyfikatów w łańcuchu. Podczas przeglądania strony za pomocą Chrome nie wystąpił błąd, ale w przypadku PHP wystąpił błąd.
Po uwzględnieniu certyfikatów pośrednich do konfiguracji zdalnego serwera WWW działało.
Możesz użyć tej strony, aby sprawdzić konfigurację SSL swojego serwera:
https://whatsmychaincert.com/
źródło
kiedy uruchamiam
'var_dump(php_ini_loaded_file());'
, otrzymuję ten wynik na mojej stronie'C:\Development\bin\apache\apache2.4.33\bin\php.ini' (length=50)'
i aby php załadował mój plik certyfikatu, musiałem edytować plik php.ini w tej ścieżce
'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.htmlJestem na Windowsie 10, używając Drupala 8, Wampa i php7.2.4
źródło
Mam właściwe rozwiązanie tego problemu, spróbujmy zrozumieć podstawową przyczynę tego problemu. Ten problem występuje, gdy nie można zweryfikować zdalnych serwerów ssl przy użyciu certyfikatów głównych w magazynie certyfikatów systemu lub zdalny ssl nie jest zainstalowany razem z certyfikatami łańcuchowymi. Jeśli masz system Linux z dostępem root ssh, w takim przypadku możesz spróbować zaktualizować bazę certyfikatów za pomocą poniższego polecenia:
update-ca-certificates
Jeśli nadal nie działa, musisz dodać główny i tymczasowy certyfikat zdalnego serwera w swoim magazynie certyfikatów. Możesz pobrać certyfikaty root i pośrednie i dodać je do katalogu / usr / local / share / ca-certyfikaty, a następnie uruchomić polecenie
update-ca-certificates
. To powinno załatwić sprawę. Podobnie w przypadku systemu Windows można wyszukać sposób dodawania certyfikatu root i pośredniego.Innym sposobem rozwiązania tego problemu jest poproszenie zdalnego zespołu serwerów o dodanie certyfikatu ssl jako pakietu certyfikatu głównego domeny, certyfikatu pośredniego i certyfikatu głównego.
źródło
Gdy używasz systemu Windows, myślę, że twój separator ścieżek to „\” (i „/” w systemie Linux). Spróbuj użyć stałej
DIRECTORY_SEPARATOR
. Twój kod będzie bardziej przenośny.Próbować:
EDYCJA: i wpisz pełną ścieżkę. Miałem pewne problemy ze ścieżkami względnymi (być może curl jest wykonywany z innego katalogu podstawowego?)
źródło
jeśli używasz WAMP, powinieneś również dodać linię certyfikatu do php.ini dla Apache (oprócz domyślnego pliku php.ini):
działa dla php5.3 +
źródło