Otrzymuję następujący błąd:
Exception in thread Thread-3:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 810, in __bootstrap_inner
self.run()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 763, in run
self.__target(*self.__args, **self.__kwargs)
File "/Users/Matthew/Desktop/Skypebot 2.0/bot.py", line 271, in process
info = urllib2.urlopen(req).read()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 154, in urlopen
return opener.open(url, data, timeout)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 431, in open
response = self._open(req, data)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 449, in _open
'_open', req)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 409, in _call_chain
result = func(*args)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1240, in https_open
context=self._context)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1197, in do_open
raise URLError(err)
URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)>
To jest kod powodujący ten błąd:
if input.startswith("!web"):
input = input.replace("!web ", "")
url = "https://domainsearch.p.mashape.com/index.php?name=" + input
req = urllib2.Request(url, headers={ 'X-Mashape-Key': 'XXXXXXXXXXXXXXXXXXXX' })
info = urllib2.urlopen(req).read()
Message.Chat.SendMessage ("" + info)
Interfejs API, którego używam, wymaga ode mnie używania HTTPS. Jak mogę ominąć weryfikację?
python
python-2.7
ssl
ssl-certificate
urllib
użytkownik3724476
źródło
źródło
Odpowiedzi:
Jeśli tylko chcesz weryfikacji bocznego, można utworzyć nowy SSLContext . Domyślnie nowo utworzone konteksty używają CERT_NONE .
Uważaj na to, jak podano w sekcji 17.3.7.2.1
Ale jeśli chcesz, aby działało teraz z innego powodu, możesz wykonać następujące czynności, musisz
import ssl
również:To powinno rozwiązać problem, ale tak naprawdę nie rozwiązujesz żadnego z problemów, ale nie zobaczysz tego,
[SSL: CERTIFICATE_VERIFY_FAILED]
ponieważ teraz nie weryfikujesz certyfikatu!Aby dodać do powyższego, jeśli chcesz dowiedzieć się więcej o tym, dlaczego widzisz te problemy, zajrzyj do PEP 476 .
Zaleca się rezygnację, która nie różni się od mojej powyższej porady:
Zawiera również wysoce zniechęconą opcję monkeypatchingu, której często nie widać w pythonie:
Który zastępuje domyślną funkcję tworzenia kontekstu z funkcją tworzenia niezweryfikowanego kontekstu.
Należy pamiętać, że zgodnie z PEP:
Jeśli chcesz przeczytać artykuł o tym, dlaczego sprawdzanie poprawności certyfikatów jest złe w oprogramowaniu , możesz go znaleźć tutaj !
źródło
setup.py upload
jak mogę to naprawić?certifi
i aktualizacja openssl na pudełkach.context
jest to, czego potrzebowałemTo nie jest rozwiązanie twojego konkretnego problemu, ale umieszczam go tutaj, ponieważ ten wątek jest najlepszym wynikiem Google dla „SSL: CERTIFICATE_VERIFY_FAILED” i prowadzi mnie do dzikiej gęsi.
Jeśli zainstalowałeś Python 3.6 na OSX i otrzymujesz błąd „SSL: CERTIFICATE_VERIFY_FAILED” podczas próby połączenia się z witryną https: //, to prawdopodobnie dlatego, że Python 3.6 na OSX w ogóle nie ma certyfikatów i nie może zweryfikować żadnego SSL znajomości. Jest to zmiana dla wersji 3.6 OSX i wymaga kroku poinstalacyjnego, który instaluje
certifi
pakiet certyfikatów. Jest to udokumentowane w ReadMe, które należy znaleźć na stronie/Applications/Python\ 3.6/ReadMe.rtf
ReadMe sprawi, że uruchomisz ten skrypt poinstalacyjny, który po prostu instaluje
certifi
:/Applications/Python\ 3.6/Install\ Certificates.command
Informacje o wersji zawierają więcej informacji: https://www.python.org/downloads/release/python-360/
źródło
/Applications/Python\ 3.7/Install\ Certificates.command
uruchamiając to bezpośrednio wterminal
! Dziękuję @CraigGlennie & @muyong Doceniamout-of-the-box-thinking
za umieszczenie tego tutaj!Aby rozwinąć odpowiedź Craiga Glenniego:
w Python 3.6.1 na MacOs Sierra
Wprowadzenie tego w terminalu bash rozwiązało problem:
źródło
sudo /Applications/Python\ 3.6/Install\ Certificates.command
jeśli uprawnienia zostaną odrzucone.W systemie Windows Python nie patrzy na certyfikat systemowy, używa własnego zlokalizowanego na
?\lib\site-packages\certifi\cacert.pem
.Rozwiązanie twojego problemu:
cacert.pem
lokalizację:from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH)
cacert.pem
plik i wklej certyfikat weryfikacji domeny na końcu pliku.źródło
lib\site-packages\certifi\cacert.pem
nie istnieje w Python 2.7.10. I nie chodzi ourllib2
torequests
/usr/local/lib/python2.7/dist-packages/certifi-2015.09.06.2-py2.7.egg/certifi/cacert.pem
. Dzięki!Moje rozwiązanie dla Mac OS X:
1) Uaktualnij do Python 3.6.5 przy użyciu natywnej aplikacji Python instalatora pobranej z oficjalnej strony w języku Python https://www.python.org/downloads/
Przekonałem się, że ten instalator dba o aktualizację linków i dowiązań symbolicznych dla nowego Pythona znacznie lepiej niż homebrew.
2) Zainstaluj nowy certyfikat, używając „./Install Certificates.command”, który znajduje się w odświeżonym katalogu Python 3.6
źródło
Możesz spróbować dodać to do zmiennych środowiskowych:
Pamiętaj, że spowoduje to wyłączenie całej weryfikacji HTTP, więc jest to trochę młot kowalski, jednak jeśli weryfikacja nie jest wymagana, może to być skuteczne rozwiązanie.
źródło
Miałem podobny problem, chociaż używałem
urllib.request.urlopen
w Pythonie 3.4, 3.5 i 3.6 . (Jest to część ekwiwalentu języka Python 3urllib2
, zgodnie z uwagą na początkuurllib2
strony dokumentacji Python 2 ).Moim rozwiązaniem była
pip install certifi
instalacjacertifi
, która ma:Następnie w moim kodzie, w którym wcześniej miałem:
Zmieniłem to, aby:
Jeśli poprawnie przeczytałem
urllib2.urlopen
dokumentację , ma ona równieżcafile
argument. Więcurllib2.urlopen([...], certifi.where())
może działać również dla Pythona 2.7.Update (01.1.2020) jako Pythona 3.6 argument jest przestarzała , z argumentem ma być użyty ten. Odkryłem, że następujące elementy działają równie dobrze w wersjach od 3.5 do 3.8:
cafile
urlopen
context
źródło
load_verify_locations
mutujeSSLContext
instancję i zwracaNone
. Zamiast tego powinieneś użyćcontext=ssl.create_default_context(cafile=certifi.where())
. Zobaczssl
dokumentację, aby uzyskać więcej informacji.ssl
funkcji. Zobacz edycję; dobrze?Zaczerpnięte stąd https://gist.github.com/michaelrice/a6794a017e349fc65d01
źródło
Jak napisałem w komentarzu, ten problem jest prawdopodobnie związany z tą SO odpowiedzią .
Krótko mówiąc: istnieje wiele sposobów weryfikacji certyfikatu. Weryfikacja używana przez OpenSSL jest niezgodna z zaufanymi certyfikatami głównymi posiadanymi w systemie. OpenSSL jest używany przez Python.
Możesz spróbować uzyskać brakujący certyfikat dla publicznego głównego urzędu certyfikacji Verisign klasy 3 a następnie użyć
cafile
opcji zgodnie z dokumentacją w języku Python :źródło
Miałem podobny problem na jednym z moich komputerów z systemem Linux. Generowanie świeżych certyfikatów i eksportowanie zmiennej środowiskowej wskazującej katalog certyfikatów naprawiło to dla mnie:
źródło
Muszę dodać kolejną odpowiedź, ponieważ podobnie jak Craig Glennie poszedłem na dziką gęś z powodu wielu postów dotyczących tego problemu w Internecie.
Używam MacPorts, a to, co pierwotnie uważałem za problem Pythona, było w rzeczywistości problemem MacPorts: nie instaluje certyfikatu głównego podczas instalacji openssl. Rozwiązaniem jest
port install curl-ca-bundle
, jak wspomniano w tym poście na blogu .źródło
Znalazłem to ponad tutaj
Znalazłem to rozwiązanie, wstaw ten kod na początku pliku źródłowego:
Ten kod powoduje cofnięcie weryfikacji, dzięki czemu certyfikacja ssl nie jest weryfikowana.
źródło
W przypadku Python 3.4+ na Centos 6/7 , Fedora , po prostu zainstaluj zaufany urząd certyfikacji w ten sposób:
/etc/pki/ca-trust/source/anchors/
update-ca-trust force-enable
update-ca-trust extract
źródło
Rozwiązanie dla Anacondy
Moja konfiguracja to Anaconda Python 3.7 na MacOS z proxy. Ścieżki są różne.
który w moim systemie wyprodukował
Gdy wiesz, dokąd idzie certyfikat, konkatenujesz certyfikat używany przez proxy do końca tego pliku.
Już skonfigurowałem conda do pracy z moim serwerem proxy, uruchamiając:
Jeśli nie pamiętasz, gdzie jest twój certyfikat, możesz go znaleźć w
~/.condarc
:Teraz połącz ten plik do końca,
/miniconda3/ssl/cert.pem
a żądania powinny działać, w szczególnościsklearn.datasets
powinny działać podobne narzędzia.Dalsze zastrzeżenia
Inne rozwiązania nie działały, ponieważ konfiguracja Anaconda jest nieco inna:
Ścieżka
Applications/Python\ 3.X
po prostu nie istnieje.Ścieżka dostarczone przez poniższych poleceń jest ŹLE ścieżka
źródło
Zawieszam głowę ze wstydem, ponieważ miałem ten sam problem, z tym wyjątkiem, że w moim przypadku adres URL, który podałem, był prawidłowy, certyfikat był ważny. To, co nie było prawidłowe, było moje połączenie z Internetem. Nie udało mi się dodać szczegółów proxy do przeglądarki (w tym przypadku IE). Spowodowało to zatrzymanie procesu weryfikacji.
Dodano w szczegółach proxy, a mój python był wtedy bardzo szczęśliwy.
źródło
Python 2.7.12 (domyślnie, 29 lipca 2016, 15:26:22) naprawił wspomniany problem. Te informacje mogą pomóc komuś innemu.
źródło
certifi
, które najwyraźniej jest zgarnięciem posiadanych certyfikatówrequests
, naprawiło dla mnie problem w Pythonie 3.4 do 3.6 .Dziwi mnie, że wszystkie te instrukcje nie rozwiązały mojego problemu. Niemniej jednak diagnostyka jest poprawna (BTW, używam komputerów Mac i Python3.6.1). Podsumowując poprawną część:
Dla mnie skrypt nie działa, a wszystkie te instalacje certifi i openssl również nie zostały naprawione. Może dlatego, że mam wiele instalacji Python 2 i 3, a także wiele virtualenv. Na koniec muszę to naprawić ręcznie.
Jeśli to ci się nie powiedzie. Następnie ponownie zainstaluj OpenSSL.
źródło
Podobnie jak ty, używam Pythona 2.7 na moim starym komputerze iMac (OS X 10.6.8), również napotkałem problem, używając urllib2.urlopen:
Moje programy działały poprawnie bez problemów z certyfikatem SSL i nagle (po pobraniu programów) uległy awarii z powodu tego błędu SSL.
Problemem była zastosowana wersja Pythona:
Nie ma problemu z https://www.python.org/downloads i python-2.7.9-macosx10.6.pkg
problem z tym zainstalowanym przez narzędzie Homebrew : „brew install python”, wersja znajduje się w / usr / local / bin.
Jeden z rozdziałów, zwany
Certificate verification and OpenSSL [CHANGED for Python 2.7.9]
w/Applications/Python 2.7/ReadMe.rtf
wyjaśnia problem z wieloma szczegółami.Więc sprawdź, pobierz i wstaw do swojej PATH odpowiednią wersję Pythona.
źródło
Python 2.7 na Amazon EC2 z centOS 7
Musiałem ustawić zmienną env,
SSL_CERT_DIR
aby wskazywała na moją,ca-bundle
która była zlokalizowana/etc/ssl/certs/ca-bundle.crt
źródło
SSL_CERT_DIR
się/etc/ssl/certs
, a także upewnić się, żeca-certificates
pakiet został zainstalowany i aktualne.Źródło: https://access.redhat.com/articles/2039753
źródło
Próbować
To zadziałało dla mnie.
źródło
Spojrzeć na
/ Applications / Python 3.6 / Install Certificates.command
Możesz także przejść do aplikacji i kliknąć polecenie Certificates.command
źródło
W moim przypadku był już ten błąd, bo
requests
iurllib3
wersje były sprzeczne, co daje następujący błąd podczas instalacji:wykonał lewę.
źródło
Kolejne rozwiązanie Anaconda.Otrzymywałem CERTIFICATE_VERIFY_FAILED w moim środowisku Python 2.7 na macOS. Okazuje się, że ścieżki conda były złe:
środowisko podstawowe (3.7):
2.7 środowisko (ścieżki nie istniały!):
Poprawka:
źródło
Błąd SSL: CERTIFICATE_VERIFY_FAILED może również wystąpić, ponieważ w
ca-certificates
pakiecie w systemie Linux brakuje certyfikatu pośredniego . Na przykład w moim przypadku brakowało certyfikatu pośredniego „ DigiCert SHA2 Secure Server CA ”,ca-certificates
mimo że przeglądarka Firefox go zawiera. Możesz dowiedzieć się, którego certyfikatu brakuje, bezpośrednio uruchamiającwget
polecenie w adresie URL, które powoduje ten błąd. Następnie możesz wyszukać odpowiedni link do pliku CRT dla tego certyfikatu z oficjalnej strony internetowej (np. Https://www.digicert.com/digicert-root-certificates.htm w moim przypadku) urzędu certyfikacji. Teraz, aby dołączyć brakujący certyfikat w twoim przypadku, możesz uruchomić poniższe polecenia, używając linku do pobrania pliku CRT:Następnie możesz ponownie przetestować
wget
adres URL, a także używającurllib
pakietu python . Aby uzyskać więcej informacji, patrz: https://bugs.launchpad.net/ubuntu/+source/ca-certificates/+bug/1795242źródło
Jeśli korzystasz z vCenter 6, powinieneś zamiast tego dodać certyfikat ośrodka certyfikacji vmware vCenter do listy zaufanych urzędów certyfikacji w swoim systemie operacyjnym. Aby pobrać swój certyfikat, wykonaj następujące czynności
Na Fedorze
Spinki do mankietów:
źródło
kroki instalacji dla nltk (miałem już Python3 (3.6.2) zainstalowany już w MAC OS X)
użyj opcji ignoruj zainstalowane, aby zignorować odinstalowanie poprzedniej wersji sześciu, w przeciwnym razie wyświetla błąd podczas odinstalowywania i nie przesyła filmu do przodu
Sprawdź instalację pipa i pythona, użyj wersji „3”
Sprawdź, czy NLTK jest zainstalowany
Zainstaluj certyfikat SSL przed zainstalowaniem podręcznika przykładów, w przeciwnym razie będziemy certyfikować błąd podczas instalowania przykładów
To zakończyło instalację nltk i nltk_ata dla przykładów książek
źródło
Instalowanie
PyOpenSSL
za pomocąpip
działało dla mnie (bez konwersji do PEM):źródło
Rozwiązałem ten problem, zamykając Fiddler (proxy debugujące HTTP), czy masz włączone proxy i spróbuj ponownie.
źródło
W Pythonie 2.7 dodawanie szczegółowych informacji o zaufanym głównym urzędzie certyfikacji na końcu w pliku C: \ Python27 \ lib \ site-packages \ certifi \ cacert.pem pomógł
po tym uruchomiłem (używając uprawnień administratora) pip install --trusted-host pypi.python.org --trusted-host pypi.org --trusted-host files.pythonhosted.org nazwa_pakietu
źródło