Pracuję nad prostym skryptem, który obejmuje CAS, kontrolę bezpieczeństwa jspring, przekierowanie itp. Chciałbym skorzystać z zapytań Kennetha Reitza, ponieważ to świetna robota! Jednak CAS wymaga potwierdzenia przez SSL, więc najpierw muszę przejść ten krok. Nie wiem, czego żąda Python? Gdzie powinien znajdować się ten certyfikat SSL?
Traceback (most recent call last):
File "./test.py", line 24, in <module>
response = requests.get(url1, headers=headers)
File "build/bdist.linux-x86_64/egg/requests/api.py", line 52, in get
File "build/bdist.linux-x86_64/egg/requests/api.py", line 40, in request
File "build/bdist.linux-x86_64/egg/requests/sessions.py", line 209, in request
File "build/bdist.linux-x86_64/egg/requests/models.py", line 624, in send
File "build/bdist.linux-x86_64/egg/requests/models.py", line 300, in _build_response
File "build/bdist.linux-x86_64/egg/requests/models.py", line 611, in send
requests.exceptions.SSLError: [Errno 1] _ssl.c:503: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
python
ssl
python-requests
urllib3
TedBurrows
źródło
źródło
Odpowiedzi:
Problem, który masz, jest spowodowany niezaufanym certyfikatem SSL.
Podobnie jak @dirk wspomniany w poprzednim komentarzu, najszybszą poprawką jest ustawienie
verify=False
:Pamiętaj, że spowoduje to, że certyfikat nie zostanie zweryfikowany. Narazi to twoją aplikację na zagrożenia bezpieczeństwa, takie jak ataki typu man-in-the-middle.
Oczywiście zastosuj osąd. Jak wspomniano w komentarzach, może to być akceptowalne w przypadku aplikacji / skryptów szybkich / odrzucanych, ale tak naprawdę nie powinno iść do oprogramowania produkcyjnego .
Jeśli pominięcie sprawdzania certyfikatu jest niedopuszczalne w twoim konkretnym kontekście, rozważ następujące opcje, najlepszą opcją jest ustawienie
verify
parametru na ciąg znaków, który jest ścieżką do.pem
pliku certyfikatu (który należy uzyskać w pewien sposób bezpieczny znaczy).Tak więc, począwszy od wersji 2.0,
verify
parametr akceptuje następujące wartości wraz z ich odpowiednią semantyką:True
: powoduje sprawdzanie poprawności certyfikatu w oparciu o własne zaufane urzędy certyfikacji biblioteki (Uwaga: możesz zobaczyć, których żądań Root Certificates Requests używa za pośrednictwem biblioteki Certifi, zaufanej bazy danych RC wyodrębnionej z Requests: Certifi - Trust Database for Humans ).False
: całkowicie pomija walidację certyfikatu .Źródło: Żądania - weryfikacja certyfikatu SSL
Spójrz również na
cert
parametr tego samego linku.źródło
verify=False
wyłącza sprawdzanie certyfikatu SSL hosta.Z dokumentacji wniosków o weryfikację SSL :
Jeśli nie chcesz weryfikować certyfikatu SSL, zrób
verify=False
źródło
Nazwa pliku CA, który chcesz użyć, możesz przekazać
verify
:Jeśli używasz
verify=True
następnierequests
używa własnego zestawu CA, które mogą nie certyfikacji, który podpisał certyfikat serwera.źródło
requests
można spakować do swojej dystrybucji. Uruchom,python -mrequests.certs
aby dowiedzieć się, gdzie to wskazuje.cacert.pem
od zwijania. Zawiera wiele odwołanych certyfikatów. Sprawdź Certifi (który korzysta z aplikacji): certifi.iocacert.pem
- certyfikaty CA wyodrębnione z Mozilli (przez cURL) - to tylko przykład (jeśli lista CA używana przez popularną stronę internetową -browser nie może być użyty jako przykład, wtedy nie wiem, co może być) - punkt odpowiedzi, że możesz przekazać swój własny plik CA, jeśli lista domyślna zawiedzie.$ pip install -U requests[security]
Po otwarciu tego pytania (2012-05) wersja Żądania miała wersję 0.13.1. W wersji 2.4.1 (2014-09) wprowadzono dodatki „bezpieczeństwa”, używając
certifi
pakietu, jeśli jest dostępny.W tej chwili (2016-09) główną wersją jest 2.11.1, bez której działa dobrze
verify=False
. Nie trzeba używaćrequests.get(url, verify=False)
, jeśli jest zainstalowany zrequests[security]
dodatkami.źródło
pip install -U requests[security] --no-cache
dwa razy ipip install certifi==2015.04.28
pip install --upgrade pip
przed zainstalowaniem pakietu zabezpieczeń żądań, aby uniknąć innych błędówNapotkałem ten sam problem i weryfikacja certyfikatu ssl nie powiodła się podczas używania aws boto3, sprawdzając kod boto3, znalazłem, że
REQUESTS_CA_BUNDLE
nie jest ustawiony, więc naprawiłem oba problemy ustawiając go ręcznie:W przypadku aws-cli, myślę, że ustawienie REQUESTS_CA_BUNDLE
~/.bashrc
naprawi ten problem (nie przetestowano, ponieważ moja aws-cli działa bez niego).źródło
Jeśli masz bibliotekę, na której się opierasz,
requests
i nie możesz zmodyfikować ścieżki weryfikacji (jak w przypadkupyvmomi
), musisz znaleźćcacert.pem
pakiet z żądaniami i dołączyć do niego swój urząd certyfikacji. Oto ogólne podejście do znalezieniacacert.pem
lokalizacji:Windows
linux
btw. @ request-devs, łączenie własnych cacert z żądaniem jest naprawdę, bardzo denerwujące ... szczególnie fakt, że nie wydaje się, abyś najpierw używał systemu ca store i nie jest to nigdzie udokumentowane.
aktualizacja
w sytuacjach, w których korzystasz z biblioteki i nie masz kontroli nad lokalizacją pakietu ca, możesz również jawnie ustawić lokalizację pakietu ca na pakiet całego hosta:
źródło
verify
ścieżki.Mam ten sam problem przy użyciu gspread i te polecenia działają dla mnie:
źródło
Jeśli chcesz usunąć ostrzeżenia, użyj poniższego kodu.
i za
verify=False
pomocąrequest.get
lubpost
metodyźródło
Znalazłem konkretne podejście do rozwiązania podobnego problemu. Chodzi o wskazanie pliku cacert przechowywanego w systemie i wykorzystywanego przez inne aplikacje oparte na ssl.
W Debianie (nie jestem pewien, czy tak samo jest w innych dystrybucjach) pliki certyfikatów (.pem) są przechowywane w
/etc/ssl/certs/
Tak więc to jest kod, który działa dla mnie:Aby zgadnąć, który
pem
plik wybrać, przejrzałem adres URL i sprawdziłem, który urząd certyfikacji (CA) wygenerował certyfikat.EDYCJA: jeśli nie możesz edytować kodu (ponieważ korzystasz z trzeciej aplikacji), możesz spróbować dodać
pem
certyfikat bezpośrednio do/usr/local/lib/python2.7/dist-packages/requests/cacert.pem
(np. Skopiować go na koniec pliku).źródło
/usr/local/lib/python2.7/dist-packages/requests/cacert.pem
dowiązaniem symbolicznym do sklepu z systemem operacyjnym?Jeśli nie przejmujesz się certyfikatem, skorzystaj z niego
verify=False
.źródło
Po godzinach debugowania mogłem to uruchomić tylko przy użyciu następujących pakietów:
za pomocą
OpenSSL 1.0.2g 1 Mar 2016
Bez tych pakietów
verify=False
nie działał.Mam nadzieję, że to komuś pomoże.
źródło
Natrafiłem na ten sam problem. Okazuje się, że nie zainstalowałem certyfikatu pośredniego na moim serwerze (wystarczy dołączyć go do dolnej części certyfikatu, jak pokazano poniżej).
https://www.digicert.com/ssl-support/pem-ssl-creation.htm
Upewnij się, że masz zainstalowany pakiet certyfikatów ca:
Aktualizacja czasu może rozwiązać ten problem:
Jeśli używasz samopodpisanego certyfikatu, prawdopodobnie będziesz musiał ręcznie dodać go do systemu.
źródło
Jeśli wywołania żądań są zakopane gdzieś głęboko w kodzie i nie chcesz instalować certyfikatu serwera, to tylko w celach debugowania możliwe jest monitorowanie żądań małp:
Nigdy nie używaj w produkcji!
źródło
Chyba za późno na przyjęcie, ale chciałem wkleić poprawkę dla innych wędrowców takich jak ja! Więc dla mnie działało w Pythonie 3.7.x
Wpisz następujące dane w swoim terminalu
Spróbuj ponownie uruchomić skrypt / żądania i sprawdź, czy działa (jestem pewien, że nie zostanie jeszcze naprawiony!). Jeśli to nie zadziałało, spróbuj bezpośrednio uruchomić następującą komendę w terminalu
źródło
Walczyłem z tym problemem przez HOURS.
Próbowałem zaktualizować żądania. Następnie zaktualizowałem certyfikat. Wskazałem weryfikację na certifi.where () (kod i tak domyślnie to robi). Nic nie działało.
W końcu zaktualizowałem moją wersję Pythona do Pythona 2.7.11. Byłem w Pythonie 2.7.5, który miał pewne niezgodności ze sposobem weryfikacji certyfikatów. Po zaktualizowaniu Pythona (i kilku innych zależności) zaczął działać.
źródło
Jest to podobne do odpowiedzi @ rafael-almeida, ale chcę zauważyć, że od żądań 2.11+ nie ma 3 wartości, które
verify
można przyjąć, w rzeczywistości są to 4:True
: sprawdza poprawność względem wewnętrznych zaufanych urzędów certyfikacji żądań.False
: całkowicie pomija walidację certyfikatu . (Niepolecane)Reszta mojej odpowiedzi dotyczy nr 4, jak używać katalogu zawierającego certyfikaty do sprawdzania poprawności:
Uzyskaj potrzebne certyfikaty publiczne i umieść je w katalogu.
Ściśle mówiąc, prawdopodobnie „powinieneś” skorzystać z pozapasmowej metody uzyskiwania certyfikatów, ale możesz też po prostu pobrać je za pomocą dowolnej przeglądarki.
Jeśli serwer używa łańcucha certyfikatów, pamiętaj, aby uzyskać każdy pojedynczy certyfikat w łańcuchu.
Zgodnie z dokumentacją żądań katalog zawierający certyfikaty musi być najpierw przetworzony za pomocą narzędzia „rehash” (
openssl rehash
).(Wymaga to openssl 1.1.1+ i nie wszystkie implementacje openssl dla systemu Windows obsługują ponowne użycie. Jeśli
openssl rehash
to nie zadziała, możesz spróbować uruchomić skrypt ruby ponownego otwierania na https://github.com/ruby/openssl/blob/master /sample/c_rehash.rb , chociaż nie próbowałem tego.)Miałem problem z otrzymywaniem próśb o rozpoznanie moich certyfikatów, ale po użyciu
openssl x509 -outform PEM
polecenia do konwersji certyfikatów do.pem
formatu Base64 wszystko działało idealnie.Możesz też po prostu zrobić leniwe powtórzenie:
źródło
W module żądań występuje obecnie błąd powodujący ten błąd, obecny w wersjach od 2.6.2 do 2.12.4 (ATOW): https://github.com/kennethreitz/requests/issues/2573
Obejściem tego problemu jest dodanie następującego wiersza:
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS'
źródło
Jak wspomniał @Rafael Almeida, twój problem jest spowodowany niezaufanym certyfikatem SSL. W moim przypadku certyfikat SSL nie był zaufany przez mój serwer. Aby obejść ten problem bez narażania bezpieczeństwa, pobrałem certyfikat i zainstalowałem go na serwerze (wystarczy dwukrotnie kliknąć plik .crt, a następnie zainstalować certyfikat ...).
źródło
Dodanie opcji nie jest możliwe, jeśli żądania są wywoływane z innego pakietu. W takim przypadku dodanie certyfikatów do pakietu cacert jest prostą ścieżką, np. Musiałem dodać „StartCom Class 1 Primary Intermediate Server CA”, dla którego pobrałem certyfikat główny do StartComClass1.pem. biorąc pod uwagę, że moja virtualenv nazywa się caldav, dodałem certyfikat z:
jeden z nich może wystarczyć, nie sprawdziłem
źródło
Miałem podobny lub taki sam problem z weryfikacją certyfikacji. Przeczytałem, że wersje OpenSSL mniejsze niż 1.0.2, których żądania zależą czasem od problemów z weryfikacją silnych certyfikatów (patrz tutaj ). Wydaje się, że CentOS 7 używa wersji 1.0.1e, która wydaje się mieć problem.
Nie byłem pewien, jak obejść ten problem na CentOS, więc postanowiłem pozwolić na słabsze 1024-bitowe certyfikaty CA.
źródło
Musiałem uaktualnić z Python 3.4.0 do 3.4.6
źródło
W moim przypadku powód był dość trywialny.
Wiedziałem, że weryfikacja SSL działała do kilku dni wcześniej i faktycznie działała na innej maszynie.
Moim następnym krokiem było porównanie zawartości i rozmiaru certyfikatu między komputerem, na którym działała weryfikacja, a tym, na którym nie była.
To szybko doprowadziło mnie do stwierdzenia, że certyfikat na „niepoprawnie” działającej maszynie nie był dobry, a kiedy zastąpiłem go „dobrym” certyfikatem, wszystko było w porządku.
źródło