Próbowałem uzyskać dostęp do tej konkretnej usługi REST ze strony PHP, którą utworzyłem na naszym serwerze. Zawęziłem problem do tych dwóch linii. Moja strona PHP wygląda tak:
<?php
$response = file_get_contents("https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json");
echo $response; ?>
Strona umiera w wierszu 2 z następującymi błędami:
- Ostrzeżenie: file_get_contents (): Operacja SSL nie powiodła się z kodem 1. OpenSSL Komunikaty o błędach: błąd: 14090086: Procedury SSL: SSL3_GET_SERVER_CERTIFICATE: weryfikacja certyfikatu nie powiodła się ... php w linii 2
- Ostrzeżenie: file_get_contents (): Nie można włączyć szyfrowania w ... php w linii 2
- Ostrzeżenie: file_get_contents (
https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json
): nie można otworzyć strumienia: operacja nie powiodła się w ... php w linii 2
Używamy serwera Gentoo. Niedawno zaktualizowaliśmy do wersji PHP 5.6. Ten problem pojawił się po aktualizacji.
Znalazłem, kiedy zastępuję usługę REST adresem takim jak https://www.google.com
; moja strona działa dobrze.
We wcześniejszej próbie ustawiłem “verify_peer”=>false
i przekazałem to jako argument do file_get_contents, jak opisano tutaj: file_get_contents ignorując Verify_peer => false? Ale jak zauważył pisarz; to nie miało znaczenia.
Zapytałem jednego z naszych administratorów serwerów, czy istnieją następujące wiersze w naszym pliku php.ini:
- rozszerzenie = php_openssl.dll
- allow_url_fopen = Wł
Powiedział mi, że skoro jesteśmy na Gentoo, openssl jest kompilowany podczas kompilacji; i nie jest ustawiony w pliku php.ini.
Potwierdziłem również, że allow_url_fopen
działa. Ze względu na specjalistyczny charakter tego problemu; Nie znajduję wielu informacji o pomocy. Czy ktoś z was spotkał coś takiego? Dzięki.
Odpowiedzi:
Był to niezwykle pomocny link do znalezienia:
http://php.net/manual/en/migration56.openssl.php
Oficjalny dokument opisujący zmiany wprowadzone w celu otwarcia ssl w PHP 5.6 Odtąd dowiedziałem się o jeszcze jednym parametrze, który powinienem ustawić na false: "
Mój działający kod wygląda następująco:
źródło
file_get_contents($url, false, stream_context_create(array('ssl' => array('verify_peer' => false, 'verify_peer_name' => false))));
Nie należy po prostu wyłączać weryfikacji. Raczej powinieneś pobrać pakiet certyfikatów, może pakiet curl zrobi?
Następnie wystarczy umieścić go na serwerze WWW, dając użytkownikowi, który uruchamia php, uprawnienia do odczytu pliku. Następnie ten kod powinien działać dla Ciebie:
Mamy nadzieję, że certyfikat główny witryny, do której próbujesz uzyskać dostęp, znajduje się w pakiecie curl. Jeśli tak nie jest, nadal nie będzie działać, dopóki nie zdobędziesz certyfikatu głównego witryny i nie umieścisz go w pliku certyfikatu.
źródło
stream_context_set_default
której można korzystać, więc nie trzeba za każdym razem przekazywać jej do file_get_contentsNaprawiłem to, upewniając się, że OpenSSL został zainstalowany na moim komputerze, a następnie dodając to do mojego php.ini:
źródło
cert.pem
plik i ustawićphp.ini
tak, i to działało:openssl.cafile=D:\Tools\GnuWin32\bin\cacert.pem
Możesz obejść ten problem, pisząc niestandardową funkcję używającą curl, jak w:
Następnie używaj
file_get_contents_curl
zamiast,file_get_contents
gdy dzwonisz do adresu URL zaczynającego się od https.źródło
Pracując dla mnie, używam PHP 5.6. rozszerzenie openssl powinno być włączone i podczas wywoływania google map api Verify_peer make false Poniższy kod działa dla mnie.
źródło
Jeśli twoja wersja PHP to 5, spróbuj zainstalować cURL, wpisując następujące polecenie w terminalu:
źródło
cURL
.sudo port install php70-curl
Zasadniczo musisz ustawić zmienną środowiskową SSL_CERT_FILE na ścieżkę pliku PEM certyfikatu ssl pobranego z następującego łącza: http://curl.haxx.se/ca/cacert.pem .
Rozpracowanie tego zajęło mi dużo czasu.
źródło
poniższe kroki naprawią ten problem,
curl.cainfo
i wklej bezwzględną ścieżkę do miejsca, w którym pobrano certyfikat.curl.cainfo ="C:\wamp\htdocs\cert\cacert.pem"
mam nadzieję, że to pomaga !!
źródło
Chciałem tylko to dodać, ponieważ napotkałem ten sam problem i nic, co nigdzie nie mogę znaleźć, nie zadziałałoby (np. Pobranie pliku cacert.pem, ustawienie cafile w php.ini itp.)
Jeśli używasz NGINX, a Twój certyfikat SSL jest dostarczany z „certyfikatem pośrednim”, musisz połączyć pośredni plik certyfikatu z głównym plikiem „mydomain.com.crt” i powinien on działać. Apache ma ustawienie specyficzne dla pośrednich certyfikatów, ale NGINX tego nie robi, więc musi znajdować się w tym samym pliku, co zwykły certyfikat.
źródło
Przyczyną tego błędu jest to, że PHP nie ma listy zaufanych urzędów certyfikacji.
PHP 5.6 i nowsze wersje próbują automatycznie ładować CA zaufane przez system. Problemy z tym można naprawić. Więcej informacji można znaleźć na stronie http://php.net/manual/en/migration56.openssl.php .
PHP 5.5 i wcześniejsze są naprawdę trudne do skonfigurowania poprawnie, ponieważ musisz ręcznie określić pakiet CA w każdym kontekście żądania, czego nie chcesz rozpraszać wokół swojego kodu. Dlatego zdecydowałem się na mój kod, że dla wersji PHP <5.6 weryfikacja SSL po prostu wyłącza się:
źródło
Miał ten sam błąd z PHP 7 na XAMPP i OSX.
Powyższa odpowiedź w https://stackoverflow.com/ jest dobra, ale nie rozwiązała całkowicie problemu dla mnie. Musiałem podać pełny łańcuch certyfikatów, aby file_get_contents () znów działał. Tak to zrobiłem:
Uzyskaj certyfikat główny / pośredni
Przede wszystkim musiałem dowiedzieć się, co to jest root i certyfikat pośredni.
Najwygodniejszym sposobem może być internetowe narzędzie certyfikujące, takie jak SSL-Shopper
Tam znalazłem trzy certyfikaty, jeden certyfikat serwera i dwa certyfikaty łańcuchowe (jeden jest rootem, drugi najwyraźniej pośrednikiem).
Wszystko, co muszę zrobić, to po prostu wyszukać w Internecie oba z nich. W moim przypadku jest to katalog główny:
thawte DV SSL SHA256 CA
I to prowadzi do jego url thawte.com . Więc po prostu umieściłem ten certyfikat w pliku tekstowym i zrobiłem to samo dla pośredniego. Gotowe.
Uzyskaj certyfikat hosta
Następną rzeczą, którą musiałem zrobić, jest pobranie certyfikatu serwera. W systemie Linux lub OS X można to zrobić za pomocą openssl:
Teraz połącz je wszystkie
Teraz po prostu połącz je wszystkie w jeden plik. (Może warto po prostu umieścić je w jednym folderze, po prostu połączyłem je w jeden plik). Możesz to zrobić w następujący sposób:
powiedz PHP gdzie znaleźć łańcuch
Jest ta przydatna funkcja openssl_get_cert_locations (), która powie ci, gdzie PHP szuka plików cert. I jest ten parametr, który powie file_get_contents (), gdzie szukać plików cert. Może oba sposoby będą działać. Wolałem sposób parametru. (W porównaniu do rozwiązania wspomnianego powyżej).
To jest teraz mój kod PHP
To wszystko. file_get_contents () znów działa. Bez CURL i, mam nadzieję, bez wad bezpieczeństwa.
źródło
chain.pem
? Czy tochain.crt
jestPo padnięciu ofiarą tego problemu na centOS po aktualizacji php do php5.6 znalazłem rozwiązanie, które działało dla mnie.
Znajdź w tym katalogu odpowiedni katalog dla swoich certyfikatów
Następnie użyj tego, aby uzyskać certyfikat i umieścić go w domyślnej lokalizacji znalezionej na podstawie powyższego kodu
źródło
Miałem ten sam problem ssl na moim komputerze programisty (php 7, xampp w systemie Windows) z samopodpisanym certyfikatem próbującym otworzyć plik „ https: // localhost / ...”. Oczywiście zestaw certyfikatu głównego (cacert.pem) nie działał. Właśnie skopiowałem ręcznie kod z pliku Apache server.crt-file w pobranym pliku cacert.pem i zrobiłem wpis openssl.cafile = ścieżka / do / cacert.pem w php.ini
źródło
Inną rzeczą do wypróbowania jest ponowna instalacja,
ca-certificates
jak opisano tutaj .Kolejną rzeczą, którą należy wypróbować, jest wyraźne zezwolenie na certyfikat dla jednej witryny, jak opisano tutaj (szczególnie, jeśli ta witryna jest własnym serwerem i masz już dostęp do pliku .pem).
Natrafiłem na ten właśnie błąd SO po aktualizacji do PHP 5.6 na CentOS 6, próbując uzyskać dostęp do samego serwera, który ma tani certyfikat bezpieczeństwa, który być może musiał zostać zaktualizowany, ale zamiast tego zainstalowałem certyfikat letsencrypt i po dwóch powyższych krokach zrobiłem to sztuczka. Nie wiem, dlaczego drugi krok był konieczny.
Przydatne polecenia
Wyświetl wersję openssl:
Wyświetl bieżące ustawienia PHP cli ssl:
źródło
Odnośnie błędów podobnych do
Czy sprawdziłeś uprawnienia do certyfikatów i katalogów, do których odwołuje się openssl?
Możesz to zrobić
Aby uzyskać coś podobnego do tego
Ten problem mnie frustrował przez pewien czas, dopóki nie zdałem sobie sprawy, że mój folder „certs” ma 700 uprawnień, a powinien mieć 755 uprawnień. Pamiętaj, że to nie jest folder kluczy, ale certyfikatów. Polecam przeczytanie tego linku na temat uprawnień ssl.
Kiedyś to zrobiłem
Problem został naprawiony, przynajmniej dla mnie.
źródło
Miałem ten sam problem z kolejną bezpieczną stroną podczas używania
wget
lubfile_get_contents
. Wiele badań (w tym niektóre odpowiedzi na to pytanie) zaowocowało prostym rozwiązaniem - instalacją Curl i PHP-Curl - Jeśli dobrze zrozumiałem, Curl ma główny urząd certyfikacji dla Comodo, który rozwiązał problemZainstaluj dodatek Curl i PHP-Curl, a następnie uruchom ponownie Apache
Wszystko teraz działa.
źródło