urllib i błąd „SSL: CERTIFICATE_VERIFY_FAILED”

279

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ę?

użytkownik3724476
źródło
2
Nie ma nic złego w adresie URL i można go z powodzeniem zweryfikować za pomocą wspólnych zaufanych certyfikatów. Dlatego lepiej nie próbować ominąć sprawdzania poprawności certyfikatu, ale go naprawić. Której wersji Pythona używasz?
Steffen Ullrich,
Może to być związane z stackoverflow.com/a/27826829/3081018 . Serwer używa tego samego rodzaju łańcucha certyfikatów z wieloma ścieżkami zaufania. Zobacz, z której kawiarni możesz skorzystać do weryfikacji.
Steffen Ullrich,
7
Ten błąd występuje również w Pythonie 3.5 po aktualizacji do yosemite
pyCthon
2
To wyjaśnia sytuację. access.redhat.com/articles/2039753
Charlie Burns
4
„Jak mogę go ominąć podczas weryfikacji?” to złe pytanie. Prawdopodobnie powinieneś zapytać, jak sprawdzić poprawność certyfikatu dostarczonego przez domenę.
jww

Odpowiedzi:

296

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

Podczas bezpośredniego wywoływania konstruktora SSLContext domyślnym jest CERT_NONE. Ponieważ nie uwierzytelnia on drugiego elementu równorzędnego, może być niepewny, szczególnie w trybie klienta, w którym przez większość czasu chcesz zapewnić autentyczność serwera, z którym rozmawiasz. Dlatego w trybie klienta zdecydowanie zaleca się użycie CERT_REQUIRED.

Ale jeśli chcesz, aby działało teraz z innego powodu, możesz wykonać następujące czynności, musisz import sslrównież:

input = input.replace("!web ", "")      
url = "https://domainsearch.p.mashape.com/index.php?name=" + input
req = urllib2.Request(url, headers={ 'X-Mashape-Key': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' })
gcontext = ssl.SSLContext()  # Only for gangstars
info = urllib2.urlopen(req, context=gcontext).read()
Message.Chat.SendMessage ("" + info)

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 .

Ten PEP proponuje włączenie domyślnej weryfikacji podpisów certyfikatów X509, a także weryfikacji nazw hostów dla klientów HTTP Pythona, z zastrzeżeniem możliwości rezygnacji na podstawie połączenia. Ta zmiana zostanie zastosowana w Python 2.7, Python 3.4 i Python 3.5.

Zaleca się rezygnację, która nie różni się od mojej powyższej porady:

import ssl

# This restores the same behavior as before.
context = ssl._create_unverified_context()
urllib.urlopen("https://no-valid-cert", context=context)

Zawiera również wysoce zniechęconą opcję monkeypatchingu, której często nie widać w pythonie:

import ssl

ssl._create_default_https_context = ssl._create_unverified_context

Który zastępuje domyślną funkcję tworzenia kontekstu z funkcją tworzenia niezweryfikowanego kontekstu.

Należy pamiętać, że zgodnie z PEP:

Te wskazówki są skierowane przede wszystkim do administratorów systemu, którzy chcą przyjąć nowsze wersje Pythona, które implementują ten PEP w starszych środowiskach, które nie obsługują jeszcze weryfikacji certyfikatów w połączeniach HTTPS. Na przykład administrator może zrezygnować, dodając powyższą monkeypatch do sitecustomize.py w swoim standardowym środowisku operacyjnym dla Pythona. Aplikacje i biblioteki NIE POWINNY powodować szerokiego procesu zmiany (chyba że w odpowiedzi na ustawienie konfiguracji kontrolowane przez administratora systemu).

Jeśli chcesz przeczytać artykuł o tym, dlaczego sprawdzanie poprawności certyfikatów jest złe w oprogramowaniu , możesz go znaleźć tutaj !

Noelkd
źródło
1
Więc jeśli ten błąd powstrzymuje mnie od używania, setup.py uploadjak mogę to naprawić?
pyCthon
5
ssl._create_default_https_context = ssl._create_unverified_context to zadziałało dla mnie, jak wspomniał Noelkd pod koniec. Ponieważ nasza jest witryną intranetową dla drukarek HP ... służącą wyłącznie do skrobania ... nie mamy problemu z użyciem tej metody.
ihightower
Pierwsza metoda jest najmniej pożądana - obejście sprawdzania poprawności. Dlaczego tego, który faktycznie weryfikuje certyfikat, nie ma na liście?
jww
1
może się to również zdarzyć, jeśli masz nieaktualną wersję openSSL. Więc dla mnie to, co zadziałało, to aktualizacja do najnowszej wersji certifi i aktualizacja openssl na pudełkach.
myusuf3
1
context jest to, czego potrzebowałem
prayagupd
382

To 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 certifipakiet 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/

Craig Glennie
źródło
105
Uruchom bezpośrednio / Aplikacje / Python \ 3.6 / Install \ Certificates.command, aby rozwiązać mój problem w OSX. Dzięki.
muyong
2
Używam OS X El Capitan 10.11.6, Python 3.6.0 i to rozwiązanie działało idealnie.
y2knoproblem
2
Używam macOS Sierra 10.12.5, Python 3.6.1 i to rozwiązanie działało idealnie.
James
4
Naprawiłem to, /Applications/Python\ 3.7/Install\ Certificates.command uruchamiając to bezpośrednio w terminal! Dziękuję @CraigGlennie & @muyong Doceniam out-of-the-box-thinkingza umieszczenie tego tutaj!
JayRizzo
6
Python 3.7 na macOS Mojave: tutaj nie działa. Odinstalowałem / ponownie zainstalowałem / uruchomiłem certyfikat instalacyjny, uruchomiłem ponownie itp. .. nie działa dla mnie
Thomas,
71

Aby rozwinąć odpowiedź Craiga Glenniego:

w Python 3.6.1 na MacOs Sierra

Wprowadzenie tego w terminalu bash rozwiązało problem:

pip install certifi
/Applications/Python\ 3.6/Install\ Certificates.command
jnPy
źródło
3
spróbuj, sudo /Applications/Python\ 3.6/Install\ Certificates.commandjeśli uprawnienia zostaną odrzucone.
KingKongCoder
W rzeczywistości nie rozwiązuje to problemu w Pythonie 3.6. -1
hyperum
1
Jeśli używasz wiersza poleceń, to Cię przeraża (prawdopodobnie nie, jeśli tu jesteś, ale hej), możesz także znaleźć folder Aplikacje (lub odpowiednik w innych systemach operacyjnych) utworzony podczas instalacji przez Python, a następnie otwórz skrypt, klikając dwukrotnie. Konkretna nazwa folderu zależy od zainstalowanej wersji Pythona.
Erdős-Bacon,
Działa jak urok dla Pythona 3.7.3. Dziękuję Ci.
klbytec
Dzięki. Dosłownie szukałem setek rozwiązań, a twoje działało.
NND
43

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:

  1. pobierz certyfikat weryfikacji domeny jako plik * .crt lub * pem
  2. otwórz plik w edytorze i skopiuj jego zawartość do schowka
  3. znajdź swoją cacert.pemlokalizację:from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH)
  4. edytuj cacert.pemplik i wklej certyfikat weryfikacji domeny na końcu pliku.
  5. Zapisz plik i ciesz się prośbami!
Bruno Gabuzomeu
źródło
6
lib\site-packages\certifi\cacert.pemnie istnieje w Python 2.7.10. I nie chodzi o urllib2torequests
Kevin Smyth
2
Najlepsze jak dotąd rozwiązanie, API Twittera używa certyfikatu DigiCert, którego nie ma w pliku cacert.pem mojego pytona. Dodałem tam i VOILA!
digz6666
2
Pracowałem nad Debianem. Dla rekordów, ścieżka do pliku w moim systemie był: /usr/local/lib/python2.7/dist-packages/certifi-2015.09.06.2-py2.7.egg/certifi/cacert.pem. Dzięki!
ofavre
Niestety zapytania w Pythonie nie korzystają z magazynu zaufanych certyfikatów CA systemu operacyjnego. github.com/requests/requests/issues/2966 . Musisz ustawić REQUESTS_CA_BUNDLE github.com/bloomreach/s4cmd/issues/111#issuecomment-406839514 .
jamshid
Działa na Windows 10, Python 3.6, z interfejsami API Google i Twitter oraz ogólnie modułem żądań.
brittenb
36

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

> cd "/Applications/Python 3.6/"
> sudo "./Install Certificates.command"
Claude COULOMBE
źródło
Działa jak urok w Mac OS X.
Manu mathew
31

Możesz spróbować dodać to do zmiennych środowiskowych:

PYTHONHTTPSVERIFY=0 

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.

Chris Halcrow
źródło
17
Podejrzewam, że wyłączenie całej weryfikacji HTTP dla całego Pythona jest zbyt wygórowane, aby poradzić sobie z jednym błędem podczas weryfikacji. Istnieje wiele przypadków, w których można chcieć domyślnie zweryfikować.
trevorKirkby
Pracował dla mnie w systemie Windows Server 2016 na Python 2.7.13. Zwykle nie mam zainstalowanego Pythona na serwerach Windows, ale potrzebowałem go do aktualizacji vCenter z migracją Nexusa 1000v do VDS, a to po prostu rozwiązuje problem z samopodpisanym certyfikatem vCenter na razie (użyje VMCA i ważnych certyfikatów w ulepszone środowisko). Nie miałem szczęścia, by certyfikat został zaakceptowany przez edycję pliku cacert.pem w pakiecie zapytań pytona
Christopher Thorjussen
3
Ponadto ustawiam zmienną bezpośrednio w oknie wiersza poleceń przed uruchomieniem skryptu, więc nie będzie wyłączać wszystkich sprawdzeń, takich jak boi się @ ktoś-lub-inny, czego też nie polecam.
Christopher Thorjussen
To idealnie pasuje do mojego przypadku użycia: testowania. Nigdy nie zrobiłbym tego na produkcji, ale dla przeprowadzania testów, które nie mają nic wspólnego z SSL, jest to wspaniała opcja.
sorin
Dzięki, to rozwiązanie zrobiło to dla mnie: import os os.environ ["PYTHONHTTPSVERIFY"] = "0"
mbello
28

Miałem podobny problem, chociaż używałemurllib.request.urlopen w Pythonie 3.4, 3.5 i 3.6 . (Jest to część ekwiwalentu języka Python 3 urllib2, zgodnie z uwagą na początku urllib2strony dokumentacji Python 2 ).

Moim rozwiązaniem była pip install certifiinstalacja certifi, która ma:

... starannie wyselekcjonowana kolekcja certyfikatów głównych do sprawdzania wiarygodności certyfikatów SSL przy jednoczesnej weryfikacji tożsamości hostów TLS.

Następnie w moim kodzie, w którym wcześniej miałem:

import urllib.request as urlrq

resp = urlrq.urlopen('https://example.com/bar/baz.html')

Zmieniłem to, aby:

import urllib.request as urlrq
import certifi

resp = urlrq.urlopen('https://example.com/bar/baz.html', cafile=certifi.where())

Jeśli poprawnie przeczytałem urllib2.urlopendokumentację , ma ona również cafileargument. Więc urllib2.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:cafileurlopencontext

import urllib.request as urlrq
import certifi
import ssl

resp = urlrq.urlopen('https://example.com/bar/baz.html', context=ssl.create_default_context(cafile=certifi.where()))
hBy2Py
źródło
1
load_verify_locationsmutuje SSLContextinstancję i zwraca None. Zamiast tego powinieneś użyć context=ssl.create_default_context(cafile=certifi.where()). Zobacz ssldokumentację, aby uzyskać więcej informacji.
ostrokach
1
@ostrokach Huh, próbowałem czegoś takiego, ale musiałem użyć niewłaściwej sslfunkcji. Zobacz edycję; dobrze?
hBy2Py
13
import requests
requests.packages.urllib3.disable_warnings()

import ssl

try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # Legacy Python that doesn't verify HTTPS certificates by default
    pass
else:
    # Handle target environment that doesn't support HTTPS verification
    ssl._create_default_https_context = _create_unverified_https_context

Zaczerpnięte stąd https://gist.github.com/michaelrice/a6794a017e349fc65d01

Prostak
źródło
przetestowałem to rozwiązanie w środowisku Jenkins, środowisku osobistym, to działa!
rapport89
2
Jest to wyjątkowo niebezpieczne, ponieważ pomija CAŁĄ weryfikację certyfikatu, używa na własne ryzyko i dla KAŻDEJ osoby nie używaj tego w kodzie produkcyjnym.
dragon788
Dzięki. Wreszcie się udało. Nie jest konieczne, aby Python 3.6 był zainstalowany w / Applications na Mac OS. To powinna być zaakceptowana odpowiedź.
Biranchi
Nigdy nie powinieneś nigdy robić takich monkeypatchów. Jest to bardzo niebezpieczne i wpłynie na dalsze korzystanie z kodu.
Acumenus
10

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ć cafileopcji zgodnie z dokumentacją w języku Python :

urllib2.urlopen(req, cafile="verisign.pem")
Steffen Ullrich
źródło
Czy możesz mi pomóc w rozwiązaniu tego istotnego problemu w łączu
Brak
8

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:

$ sudo update-ca-certificates --fresh
$ export SSL_CERT_DIR=/etc/ssl/certs
ritiek
źródło
7

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 .

corwin.amber
źródło
5

Znalazłem to ponad tutaj

Znalazłem to rozwiązanie, wstaw ten kod na początku pliku źródłowego:

import ssl

try:
   _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # Legacy Python that doesn't verify HTTPS certificates by default
    pass
else:
    # Handle target environment that doesn't support HTTPS verification
    ssl._create_default_https_context = _create_unverified_https_context

Ten kod powoduje cofnięcie weryfikacji, dzięki czemu certyfikacja ssl nie jest weryfikowana.

Ganesh Chowdhary Sadanala
źródło
zobacz ten film, który pomógł mi zrozumieć, co to jest ssl. URL filmu: youtu.be/dsuVPxuU_hc
Ganesh Chowdhary Sadanala
4

W przypadku Python 3.4+ na Centos 6/7 , Fedora , po prostu zainstaluj zaufany urząd certyfikacji w ten sposób:

  1. Skopiuj plik CA.crt do /etc/pki/ca-trust/source/anchors/
  2. update-ca-trust force-enable
  3. update-ca-trust extract
Cherif KAOUA
źródło
2
Może to głupie pytanie, ale co to jest CA.crt i gdzie mogę go znaleźć?
Iqbal
4

Rozwiązanie dla Anacondy

Moja konfiguracja to Anaconda Python 3.7 na MacOS z proxy. Ścieżki są różne.

  • Oto jak uzyskać poprawną ścieżkę certyfikatów:
import ssl
ssl.get_default_verify_paths()

który w moim systemie wyprodukował

Out[35]: DefaultVerifyPaths(cafile='/miniconda3/ssl/cert.pem', capath=None,
 openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/miniconda3/ssl/cert.pem',
 openssl_capath_env='SSL_CERT_DIR', openssl_capath='/miniconda3/ssl/certs')

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:

conda config --set ssl_verify <pathToYourFile>.crt

Jeśli nie pamiętasz, gdzie jest twój certyfikat, możesz go znaleźć w ~/.condarc:

ssl_verify: <pathToYourFile>.crt

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.Xpo prostu nie istnieje.

  • Ścieżka dostarczone przez poniższych poleceń jest ŹLE ścieżka

from requests.utils import DEFAULT_CA_BUNDLE_PATH
DEFAULT_CA_BUNDLE_PATH
Lew
źródło
3

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.

Reklamy
źródło
1
Nie zawstydzaj głowy za to, że o czymś zapomniałeś, a potem wymyśliłeś to i podzieliłeś się, ktoś może uznać to za przydatne. Jednak używając IE ... wstyd: p
Davos
3

Python 2.7.12 (domyślnie, 29 lipca 2016, 15:26:22) naprawił wspomniany problem. Te informacje mogą pomóc komuś innemu.

caot
źródło
3
Spotkałem
@marcadian Instalowanie i używanie certifi, które najwyraźniej jest zgarnięciem posiadanych certyfikatów requests, naprawiło dla mnie problem w Pythonie 3.4 do 3.6 .
hBy2Py
3

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ęść:

  • Na Macu Apple upuszcza OpenSSL
  • Python używa teraz własnego zestawu certyfikatu głównego CA.
  • Binarna instalacja Pythona zapewniła skrypt do zainstalowania certyfikatu głównego CA, którego potrzebuje Python („/ Applications / Python 3.6 / Install Certificates.command”)
  • Szczegółowe informacje znajdują się w rozdziale „/ Aplikacje / Python 3.6 / ReadMe.rtf”

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.

pip install certifi   # for your virtualenv
mkdir -p /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl
cp -a <your virtualenv>/site-package/certifi/cacert.pem \
  /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/cert.pem

Jeśli to ci się nie powiedzie. Następnie ponownie zainstaluj OpenSSL.

port install openssl
Berniey
źródło
2

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:

urlopen error [SSL: CERTIFICATE_VERIFY_FAILED]

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:

  1. Nie ma problemu z https://www.python.org/downloads i python-2.7.9-macosx10.6.pkg

  2. 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.rtfwyjaśnia problem z wieloma szczegółami.

Więc sprawdź, pobierz i wstaw do swojej PATH odpowiednią wersję Pythona.

Thierry Maillard
źródło
2

Python 2.7 na Amazon EC2 z centOS 7

Musiałem ustawić zmienną env, SSL_CERT_DIRaby wskazywała na moją, ca-bundlektóra była zlokalizowana/etc/ssl/certs/ca-bundle.crt

Brian McCall
źródło
Twoja odpowiedź doprowadziła mnie do właściwej ścieżki dla mnie. Na ubuntu, musiałem ustawić SSL_CERT_DIRsię /etc/ssl/certs, a także upewnić się, że ca-certificatespakiet został zainstalowany i aktualne.
Norman Breau
1

Próbować

pip install - nazwa-pakietu zaufanego hosta pypi.python.org

To zadziałało dla mnie.

swapnilghorpade
źródło
1

Spojrzeć na

/ Applications / Python 3.6 / Install Certificates.command

Możesz także przejść do aplikacji i kliknąć polecenie Certificates.command

Danielle Cohen
źródło
1

W moim przypadku był już ten błąd, bo requestsi urllib3wersje były sprzeczne, co daje następujący błąd podczas instalacji:

ERROR: requests 2.21.0 has requirement urllib3<1.25,>=1.21.1, but you'll have urllib3 1.25 which is incompatible.
pip install 'urllib3<1.25' --force-reinstall

wykonał lewę.

fabio.sang
źródło
1

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):

>>> import ssl
>>> ssl.get_default_verify_paths()
DefaultVerifyPaths(cafile='/usr/local/anaconda3/ssl/cert.pem', capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/usr/local/anaconda3/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/usr/local/anaconda3/ssl/certs')

2.7 środowisko (ścieżki nie istniały!):

DefaultVerifyPaths(cafile='', capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/usr/local/anaconda3/envs/py27/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/usr/local/anaconda3/envs/py27/ssl/certs')

Poprawka:

cd /usr/local/anaconda3/envs/py27/
mkdir ssl
cd ssl
ln -s ../../../ssl/cert.pem
Peter Tseng
źródło
1

Błąd SSL: CERTIFICATE_VERIFY_FAILED może również wystąpić, ponieważ w ca-certificatespakiecie w systemie Linux brakuje certyfikatu pośredniego . Na przykład w moim przypadku brakowało certyfikatu pośredniego „ DigiCert SHA2 Secure Server CA ”, ca-certificatesmimo że przeglądarka Firefox go zawiera. Możesz dowiedzieć się, którego certyfikatu brakuje, bezpośrednio uruchamiając wgetpolecenie 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:

wget https://cacerts.digicert.com/DigiCertSHA2SecureServerCA.crt

mv DigiCertSHA2SecureServerCA.crt DigiCertSHA2SecureServerCA.der

openssl x509 -inform DER -outform PEM -in DigiCertSHA2SecureServerCA.der -out DigicertSHA2SecureServerCA.pem.crt

sudo mkdir /usr/share/ca-certificates/extra

sudo cp DigicertSHA2SecureServerCA.pem.crt /usr/share/ca-certificates/extra/

sudo dpkg-reconfigure ca-certificates

Następnie możesz ponownie przetestować wgetadres URL, a także używając urllibpakietu python . Aby uzyskać więcej informacji, patrz: https://bugs.launchpad.net/ubuntu/+source/ca-certificates/+bug/1795242

WebDev
źródło
0

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

  1. Otwórz przeglądarkę internetową.
  2. Przejdź do https: //
  3. W prawym dolnym rogu kliknij link Pobierz zaufany główny urząd certyfikacji

Na Fedorze

  1. rozpakuj i zmień rozszerzenie z .0 na .cer
  2. Skopiuj go do / etc / pki / ca-trust / source / anchors /
  3. uruchom polecenie update-ca-trust.

Spinki do mankietów:

  1. https://virtualizationreview.com/articles/2015/04/02/install-root-self-signed-certificate-vcenter-6.aspx?m=1
  2. http://forums.fedoraforum.org/showthread.php?t=293856
nobler1050
źródło
Stwierdził, że jest na OS X, a nie vCenter 6.
jww
0

kroki instalacji dla nltk (miałem już Python3 (3.6.2) zainstalowany już w MAC OS X)

sudo easy_install pip

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

sudo pip3 install -U nltk --ignore-installed six

Sprawdź instalację pipa i pythona, użyj wersji „3”

which python python2 python3
which pip pip2 pip3

Sprawdź, czy NLTK jest zainstalowany

python3
import nltk
nltk.__path__
['/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/nltk']

Zainstaluj certyfikat SSL przed zainstalowaniem podręcznika przykładów, w przeciwnym razie będziemy certyfikować błąd podczas instalowania przykładów

/Applications/Python\ 3.6/Install\ Certificates.command
python3 -m nltk.downloader book

To zakończyło instalację nltk i nltk_ata dla przykładów książek

Narasimha Sai
źródło
0

Instalowanie PyOpenSSLza pomocą pipdziałało dla mnie (bez konwersji do PEM):

pip install PyOpenSSL
averma93
źródło
0

Rozwiązałem ten problem, zamykając Fiddler (proxy debugujące HTTP), czy masz włączone proxy i spróbuj ponownie.

vperezb
źródło
0

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

MD5
źródło