HTTPS i SSL3 Pobierz certyfikat serwera:weryfikacja certyfikatu nie powiodła się, CA jest OK

Używam XAMPP do rozwoju. Ostatnio zaktualizowałem moją instalację xampp ze starej wersji do 1.7.3.

Teraz, gdy curl https włączone strony dostaję następujący wyjątek

[[0]} Fatal error: Uncaught exception 'RequestCore_Exception' with message "cURL resource: Resource id # 55; błąd cURL: problem z certyfikatem SSL, sprawdź, czy certyfikat CA jest w porządku. Szczegóły: błąd:14090086: SSL procedury: SSL3_GET_SERVER_CERTIFICATE: certificate verify failed (60) "

Wszyscy sugerują użycie określonych opcji curl z kodu PHP, aby rozwiązać ten problem. Myślę, że to nie powinna być droga. Ponieważ nie miałem żadnego problemu ze starą wersją XAMPP i stało się to dopiero po zainstalowaniu nowej wersji.

Potrzebuję pomocy, aby dowiedzieć się, jakie ustawienia zmieniają się w mojej instalacji PHP, Apache itp może rozwiązać ten problem.

Author: Uwe Keim, 2011-06-19

11 answers

Curl zawierał listę akceptowanych certyfikatów ca, ale nie wiązał już żadnych certów CA. Więc domyślnie odrzuci wszystkie certyfikaty SSL jako nieweryfikowalne.

Będziesz musiał zdobyć certyfikat CA i skierować na niego curl. Więcej szczegółów na stronie cURLS ' S Szczegóły na serwerze certyfikaty SSL .

 142
Author: Marc B,
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-22 23:32:38

To dość powszechny problem w systemie Windows. Musisz tylko ustawić cacert.pem na curl.cainfo.

Od PHP 5.3.7 można zrobić:

  1. pobierz https://curl.haxx.se/ca/cacert.pem i zapisać go gdzieś.
  2. update php.ini -- Dodaj curl.cainfo = " PATH_TO / cacert.pem "

W przeciwnym razie będziesz musiał wykonać następujące czynności dla każdego zasobu cURL:

curl_setopt ($ch, CURLOPT_CAINFO, "PATH_TO/cacert.pem");
 281
Author: Артур Курицын,
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
2016-03-31 16:24:32

ostrzeżenie: może to spowodować problemy z zabezpieczeniami, przed którymi ma chronić protokół SSL.

Ale naprawdę prostą poprawką, która zadziałała dla mnie, było wezwanie:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

Przed wywołaniem:

curl_exec():

W pliku php.

Uważam, że to wyłącza całą weryfikację certyfikatów SSL.

 81
Author: Chris Dutrow,
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
2012-09-25 01:27:23

Źródło: http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html

Curl: problem z certyfikatem SSL, sprawdź, czy certyfikat CA jest OK

07 kwietnia 2006

Podczas otwierania bezpiecznego adresu URL za pomocą Curl może wystąpić następujący błąd:

Problem z certyfikatem SSL, sprawdź czy certyfikat CA jest OK

Wyjaśnię, dlaczego błąd i co należy z nim zrobić.

Najprostszy sposób pozbycia się błędem byłoby dodanie po dwóch linijkach do twojego scenariusza . Takie rozwiązanie stanowi zabezpieczenie zaryzykuj.

//WARNING: this would prevent curl from detecting a 'man in the middle' attack
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); 

Zobaczmy, do czego służą te dwa parametry. Cytuję instrukcję.

CURLOPT_SSL_VERIFYHOST: 1 aby sprawdzić istnienie wspólnej nazwy w certyfikacie SSL peer. 2 aby sprawdzić istnienie nazwy zwyczajowej a także sprawdzić, czy pasuje do podanej nazwy hosta.

CURLOPT_SSL_VERIFYPEER: FALSE to stop CURL from verifypeer certyfikat peera. Alternatywne certyfikaty do weryfikacji mogą być określony opcją CURLOPT_CAINFO lub katalogiem certyfikatu można określić za pomocą opcji CURLOPT_CAPATH. CURLOPT_SSL_VERIFYHOST może również być TRUE lub FALSE, jeśli CURLOPT_SSL_VERIFYPEER jest wyłączony (domyślnie 2). Ustawienie CURLOPT_SSL_VERIFYHOST do 2 (jest to wartość domyślna) będzie garantee że prezentowany certyfikat ma "wspólną nazwę" dopasowanie urny, której używasz, aby uzyskać dostęp zdalny zasób. To jest zdrowa Kontrola, ale nie gwarantuje, że twój program nie jest decieved.

Enter the 'man in the middle'

Twój program może zostać wprowadzony w błąd w rozmowie z innym serwerem zamiast tego. Można to osiągnąć za pomocą kilku mechanizmów, takich jak dns lub zatrucie arp ( to jest historia na inny dzień). Intruz może również sam podpisz certyfikat o tej samej nazwie "comon" Twojego programu oczekuje. Komunikat nadal będzie zaszyfrowane, ale ty byś zdradź swoje sekrety oszustowi. Ten rodzaj ataku jest "man in the middle"

Pokonanie "człowieka w środku"

Cóż, musimy zweryfikować, że prezentowany nam certyfikat jest dobre na serio. Robimy to porównując go z certyfikatem, który rozsądne * zaufanie.

Jeśli zdalny zasób jest chroniony certyfikatem wydanym przez jednego z główne CA ' S jak Verisign, GeoTrust et al, można bezpiecznie porównaj przeciwko Pakietowi certyfikatów ca Mozilli, który można uzyskać z http://curl.haxx.se/docs/caextract.html

Zapisz plik cacert.pem gdzieś na serwerze i ustaw następujące opcje w skrypcie.

curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, TRUE); 
curl_setopt ($ch, CURLOPT_CAINFO, "pathto/cacert.pem");

Dla wszystkich powyższych informacji kredyt idzie do : http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html

 49
Author: Deepak Oberoi,
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
2014-03-07 19:18:25

Powyższe rozwiązania są świetne, ale jeśli używasz WampServer, ustawienie zmiennej curl.cainfo w php.ini może nie działać.

W końcu znalazłem WampServer ma dwa pliki php.ini:

C:\wamp\bin\apache\Apachex.x.x\bin
C:\wamp\bin\php\phpx.x.xx

Pierwszy jest używany, gdy pliki PHP są wywoływane przez przeglądarkę internetową, podczas gdy drugi jest używany, gdy polecenie jest wywoływane przez linię poleceń lub shell_exec().

TL; DR

Jeśli używasz WampServer, musisz dodać linię curl.cainfo do zarówno php.ini pliki.

 14
Author: Nate,
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
2014-09-07 03:04:34

Czasami, jeśli aplikacja, z którą próbujesz się skontaktować, ma własnoręcznie podpisane certyfikaty, normalny cacert.pem z http://curl.haxx.se/ca/cacert.pem nie rozwiązuje problemu.

Jeśli masz pewność co do adresu URL punktu końcowego usługi, naciśnij go przez przeglądarkę, Zapisz certyfikat ręcznie w formacie " x 509 certyfikat z łańcuchem (PEM)". Wskaż ten plik certyfikatu za pomocą

curl_setopt ($ch, CURLOPT_CAINFO, "pathto/{downloaded certificate chain file}");   
 4
Author: madRai,
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
2013-12-18 18:52:16

Podczas ustawiania opcji curl dla CURLOPT_CAINFO pamiętaj, aby używać pojedynczych cudzysłowów, użycie podwójnych cudzysłowów spowoduje tylko kolejny błąd. Więc twoja opcja powinna wyglądać następująco:

curl_setopt ($ch, CURLOPT_CAINFO, 'c:\wamp\www\mywebfolder\cacert.pem');

Dodatkowo w Twoim php.ustawienie pliku ini powinno być zapisane jako: (zauważ moje podwójne cudzysłowy)

curl.cainfo = "C:\wamp\www\mywebfolder"

Umieszczam go bezpośrednio pod linią, która mówi: extension=php_curl.dll

(tylko dla celów organizacyjnych, można umieścić go w dowolnym miejscu w swoim php.ini, po prostu umieścić go blisko innego odniesienia curl więc podczas wyszukiwania za pomocą słowa kluczowego curl mogę znaleźć oba odniesienia curl w jednym obszarze.)

 4
Author: LOwens1931,
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
2014-09-30 16:23:59

Z miłości do wszystkiego, co święte...

W moim przypadku musiałem ustawić zmienną konfiguracyjną openssl.cafile PHP na ścieżkę do pliku PEM.

Wierzę, że prawdą jest, że istnieje wiele systemów, w których ustawienie curl.cainfo w konfiguracji PHP jest dokładnie tym, co jest potrzebne, ale w środowisku, z którym pracuję, jakim jest kontener Docker eboraas/Laravel , który używa Debiana 8 (jessie) i PHP 5.6, ustawienie tej zmiennej nie pomogło.

Zauważyłem, że wyjście php -i nie wspomnij cokolwiek o tym konkretnym ustawieniu konfiguracyjnym, ale miało ono kilka linijek o openssl. Istnieje zarówno opcja openssl.capath, jak i openssl.cafile, ale samo ustawienie drugiej pozwoliło curl poprzez PHP w końcu być w porządku z adresami URL HTTPS.

 4
Author: Spencer Williams,
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-11-14 17:23:53

Mam ten sam błąd na amazon AMI linux.

Rozwiązałem ustawiając curl.cainfo on / etc / php.d / curl.ini

Https://gist.github.com/reinaldomendes/97fb2ce8a606ec813c4b

 2
Author: Reinaldo Mendes,
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
2014-10-09 02:43:16

Znalazłem się tutaj, gdy próbuje dostać GuzzleHttp (php+apache na Mac), aby uzyskać stronę z www.googleapis.com.

Oto moje ostateczne rozwiązanie na wypadek, gdyby komuś pomogło.

Spójrz na łańcuch certyfikatów dla dowolnej domeny, która powoduje ten błąd. Dla mnie to było googleapis.com

openssl s_client -host www.googleapis.com -port 443

Odzyskasz coś takiego:

Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.googleapis.com
   i:/C=US/O=Google Inc/CN=Google Internet Authority G2
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority

Uwaga: uchwyciłem to po tym, jak naprawiłem problem, twoje wyjście łańcucha może wyglądać inaczej.

Następnie trzeba spojrzeć at the certificates allowed in php. Uruchom phpinfo () na stronie.

<?php echo phpinfo();

Następnie poszukaj pliku certyfikatu załadowanego z wyjścia strony:

openssl.cafile  /usr/local/php5/ssl/certs/cacert.pem

Jest to plik, który musisz naprawić, dodając do niego poprawne certyfikaty.

sudo nano /usr/local/php5/ssl/certs/cacert.pem

Zasadniczo musisz dołączyć poprawny certyfikat "signatures" na końcu tego pliku.

Możesz znaleźć niektóre z nich tutaj: możesz potrzebować google/szukaj innych w łańcuchu, jeśli potrzebujesz oni.

Wyglądają tak:

przykładowy obraz certyfikatu

(uwaga: jest to obraz, więc ludzie nie będą po prostu kopiować / wklejać certyfikatów ze stackoverflow )

Gdy odpowiednie certyfikaty znajdują się w tym pliku, uruchom ponownie apache i przetestuj.

 1
Author: TrophyGeek,
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-18 21:45:23

Rozwiązanie jest bardzo proste! Wstaw ten wiersz przed curl_exec:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
Dla mnie to działa.
 -3
Author: Zsolt Boszormenyi,
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
2014-02-19 09:07:48