błąd urllib i "SSL: CERTIFICATE VERIFY FAILED"
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, który powoduje 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)
API, którego używam, wymaga ode mnie użycia HTTPS. Jak mogę to zrobić omijając weryfikację?
24 answers
Jeśli po prostu chcesz ominąć weryfikację, możesz utworzyć nowy SSLContext . Domyślnie nowo utworzone konteksty używają CERT_NONE .
Bądź ostrożny z tym, jak stwierdzono w sekcji 17.3.7.2.1
Podczas bezpośredniego wywoływania konstruktora SSLContext, CERT_NONE jest wartością domyślną. Ponieważ nie uwierzytelnia drugiego peera, może być niepewny, zwłaszcza w trybie klienta, w którym przez większość czasu chcesz zapewnić autentyczność serwer, z którym rozmawiasz. Dlatego w trybie klienta zaleca się użycie CERT_REQUIRED.
Ale jeśli chcesz, aby teraz działało z jakiegoś innego powodu, możesz zrobić następujące rzeczy, musisz również import ssl
:
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(ssl.PROTOCOL_TLSv1) # Only for gangstars
info = urllib2.urlopen(req, context=gcontext).read()
Message.Chat.SendMessage ("" + info)
To powinno obejść twój problem, ale tak naprawdę nie rozwiązujesz żadnego z problemów, ale nie zobaczysz [SSL: CERTIFICATE_VERIFY_FAILED]
, ponieważ teraz nie weryfikujesz cert!
Aby dodać do powyższego, jeśli chcesz wiedzieć więcej o tym, dlaczego widzisz na te kwestie warto przyjrzeć się PEP 476 .
Ten PEP proponuje włączyć weryfikację podpisów certyfikatów x509, a także domyślnie weryfikację nazwy hosta dla klientów http Pythona, z zastrzeżeniem opt-out na zasadzie każdego połączenia. Ta zmiana zostanie zastosowana do Pythona 2.7, Pythona 3.4 i Pythona 3.5.
Istnieje porada opt out, która nie różni się od mojej rady powyżej:
import ssl
# This restores the same behavior as before.
context = ssl._create_unverified_context()
urllib.urlopen("https://no-valid-cert", context=context)
Posiada również wysoce zniechęcona opcja poprzez monkeypatching , której często nie widać w Pythonie:
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
Która nadpisuje domyślną funkcję do tworzenia kontekstu z funkcją do tworzenia niezweryfikowanego kontekstu.
Jeśli chcesz przeczytać artykuł o tym, dlaczego nie sprawdzanie certyfikatów jest złe w oprogramowaniu , znajdziesz go tutaj!
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-09-05 20:38:10
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 to w pogoni za dziką gęsiną.
Jeśli zainstalowałeś Python 3.6 na OSX i otrzymujesz błąd "SSL: CERTIFICATE_VERIFY_FAILED" podczas próby połączenia z witryną https://, prawdopodobnie dlatego, że Python 3.6 na OSX nie ma żadnych certyfikatów i nie może potwierdzić żadnych połączeń SSL. Jest to zmiana dla 3.6 na OSX i wymaga kroku post-instalacyjnego, który instaluje pakiet certifi
certyfikatów. Jest to udokumentowane w ReadMe, które należy znaleźć w /Applications/Python\ 3.6/ReadMe.rtf
ReadMe każe Ci uruchomić ten skrypt po instalacji, który po prostu instaluje certifi
: /Applications/Python\ 3.6/Install\ Certificates.command
Uwagi do wydania mają więcej informacji: https://www.python.org/downloads/release/python-360/
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-02-19 23:49:46
Aby rozwinąć odpowiedź Craiga Glennie (sorry za mało reputacji by skomentować):
W Pythonie 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
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-07-10 17:56:02
W systemie Windows Python nie patrzy na certyfikat systemu, używa własnego znajdującego się w ?\lib\site-packages\certifi\cacert.pem
.
Rozwiązanie twojego problemu:
- Pobierz certyfikat walidacji domeny jako *.plik crt lub * pem
- otwórz plik w edytorze i skopiuj jego zawartość do schowka
- znajdź swoją
cacert.pem
lokalizację:from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH)
- edytuj plik
cacert.pem
i wklej certyfikat weryfikacji domeny na końcu pliku. - Zapisz plik i ciesz się żądaniami!
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
2015-08-10 08:39:44
Możesz spróbować dodać to do zmiennych środowiskowych:
PYTHONHTTPSVERIFY=0
Zauważ, że to wyłączy Wszystkie weryfikację HTTP, więc jest to trochę podejście młota kowalskiego, jednak jeśli weryfikacja nie jest wymagana, może być skutecznym rozwiązaniem.
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
2018-07-18 04:55:32
Moje rozwiązanie dla Mac OS X:
1) Aktualizacja do Pythona 3.6.5 za pomocą natywnego instalatora Pythona pobranego z oficjalnej strony języka Python https://www.python.org/downloads/
Odkryłem, że ten instalator zajmuje się aktualizacją linków i dowiązań symbolicznych dla nowego Pythona o wiele 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"
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
2018-04-21 07:58:47
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
Wzięte stąd https://gist.github.com/michaelrice/a6794a017e349fc65d01
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-09-29 20:58:11
Tak jak pisałem w komentarzu, ten problem jest prawdopodobnie związany z to więc odpowiedz .
W skrócie: 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 Pythona.
Możesz spróbować uzyskać brakujący certyfikat dla VeriSign Class 3 Public Primary Certification Authority , a następnie użyć opcji cafile
zgodnie z Pythonem dokumentacja :
urllib2.urlopen(req, cafile="verisign.pem")
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-09-22 23:34:47
Miałem podobny problem, choć używałem urllib.request.urlopen
w Pythona 3.4, 3.5 i 3.6 . (Jest to część ekwiwalentu Pythona 3 urllib2
, zgodnie z notatką na czele Pythona 2urllib2
strona dokumentacji .)
Moim rozwiązaniem było pip install certifi
aby zainstalować certifi
, który ma:
... starannie dobrana kolekcja certyfikatów głównych do sprawdzania wiarygodności certyfikatów SSL przy weryfikacji tożsamości TLS gospodarze.
Potem w kodzie gdzie wcześniej miałem:
import urllib.request as urlrq
resp = urlrq.urlopen('https://foo.com/bar/baz.html')
Zmieniłem na:
import urllib.request as urlrq
import certifi
resp = urlrq.urlopen('https://foo.com/bar/baz.html', cafile=certifi.where())
Jeśli przeczytam urllib2.urlopen
dokumentacja poprawnie, ma również argument cafile
. Więc urllib2.urlopen([...], certifi.where())
może działać również w Pythonie 2.7.
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
2018-01-07 05:46:18
Dla Python 3.4+ na Centos 6/7, Fedora , wystarczy zainstalować zaufanego CA w ten sposób:
- Kopiuj CA.crt do
/etc/pki/ca-trust/source/anchors/
update-ca-trust force-enable
update-ca-trust extract
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-11-17 13:45:16
Powiesiłem głowę w pół-wstydu, ponieważ miałem ten sam problem, z tym, że w moim przypadku adres URL, który podałem, był ważny, certyfikat był ważny. To, co nie było poprawne, to moje połączenie z Internetem. Nie udało mi się dodać szczegółów proxy do przeglądarki (czyli w tym przypadku). Dzięki temu proces weryfikacji nie przebiegał prawidłowo.
Dodano w szczegółach proxy i mój python był wtedy bardzo zadowolony .
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
2015-10-28 03:00:14
Podobnie jak ty, używam Pythona 2.7 na moim starym iMac (OS X 10.6.8), też spotkałem się z problemem, używając urllib2.urlopen:
urlopen error [SSL: CERTIFICATE_VERIFY_FAILED]
Moje programy działały poprawnie bez problemów z certyfikatem SSL i suddently (po załadowaniu programów), zawiesiły się z tym błędem SSL.
Problemem była używana wersja Pythona:
-
No problem with https://www.python.org/downloads i python-2.7.9-macosx10.6.pkg
Problem z instalowanym by Homebrew tool : "brew install python", wersja znajduje się w /usr/local/bin.
Rozdział, zwany Certificate verification and OpenSSL [CHANGED for Python 2.7.9]
, w /Applications/Python 2.7/ReadMe.rtf
wyjaśnia problem wieloma szczegółami.
Więc sprawdź, Pobierz i umieść w swojej ścieżce odpowiednią wersję Pythona.
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
2015-05-15 12:24:34
Try
Pip install --trusted-host pypi.python.org Nazwa pakietu
U mnie zadziałało.
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-06-06 12:34:20
Dziwię się, że te wszystkie instrukcje nie rozwiązały mojego problemu. Niemniej jednak diagnostyka jest poprawna (BTW, używam Mac i Python3.6.1). Tak więc, aby podsumować poprawną część:
- na Macu Apple rezygnuje z OpenSSL
- Python używa teraz własnego zestawu certyfikatu głównego CA
- binarna instalacja Pythona zapewniła skrypt do instalacji certyfikatu głównego CA wymaganego przez Pythona ("/Applications/Python 3.6 / Install Certificates.command")
- Czytaj " / Aplikacje / Python 3.6 / ReadMe.rtf " o szczegóły
Dla mnie skrypt nie działa, i wszystkie te certyfikaty i openssl instalacji nie udało się naprawić. Może dlatego, że mam wiele instalacji Pythona 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 nadal cię zawiedzie. Następnie ponownie / zainstaluj OpenSSL.
port install openssl
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
2018-02-28 23:31:39
Muszę dodać kolejną odpowiedź, ponieważ podobnie jak Craig Glennie, poszedłem na Dziki Gon z powodu wielu postów odnoszących się do tego problemu w Internecie.
Używam MacPorts, a to, co początkowo uważałem za problem Pythona, było w rzeczywistości problemem MacPorts: nie instaluje certyfikatu głównego z instalacją openssl. Rozwiązaniem jest port install curl-ca-bundle
, jak wspomniano w ten post na blogu .
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-07-28 19:06:05
Spójrz na
/ Applications / Python 3.6 / Install Certificates.command
Możesz również przejść do aplikacji i kliknąć na certyfikaty.command
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-08-16 14:49:54
Jeśli twój cert on vCenter 6, powinieneś zamiast tego dodać swój certyfikat VMware Cert authority vCenter do listy zaufanych urzędów certyfikacji systemu operacyjnego. aby pobrać swój cert wykonaj następujące czynności
- Otwórz przeglądarkę internetową.
- Przejdź do https: / /
- w prawym dolnym rogu kliknij link Pobierz zaufany Root CA
Na Fedorze
- Rozpakuj i zmień rozszerzenie z .0 do .cer
- skopiuj go do pliku/etc / PKI / ca-trust/source/anchors /
- Uruchom polecenie update-ca-trust.
Linki:
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-04-25 01:57:53
Python 2.7.12 (domyślnie, 29 lip 2016, 15:26:22) Naprawiono wspomniany problem. Te informacje mogą pomóc komuś innemu.
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-07-29 20:09:30
Kroki instalacji dla nltk (miałem python3 (3.6.2) zainstalowany już w MAC OS X
sudo easy_install pip
Użyj opcji Ignoruj zainstalowane, aby zignorować odinstalowanie poprzedniej wersji six, w przeciwnym razie, to daje błąd podczas odinstalowania i nie film do przodu
sudo pip3 install -U nltk --ignore-installed six
Sprawdź instalację pip i Pythona, użyj wersji ' 3 '
which python python2 python3
which pip pip2 pip3
Sprawdź czy nltk jest zainstalowane
python3
import nltk
nltk.__path__
['/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/nltk']
Zainstaluj certyfikat SSL przed zainstalowaniem książki przykładów, w przeciwnym razie będziemy certyfikować błąd podczas instalowanie przykładów
/Applications/Python\ 3.6/Install\ Certificates.command
python3 -m nltk.downloader book
, który pomyślnie zakończył instalację nltk i nltk_ata dla przykładów książek
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-09-03 16:12:39
Instalacja PyOpenSSL
za pomocą pip
zadziałała dla mnie (bez konwersji do PEM):
pip install PyOpenSSL
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
2018-02-15 16:37:24
Miałem ten problem rozwiązany przez zamknięcie Fiddler (proxy debugowania HTTP) sprawdź czy masz włączony proxy i spróbuj ponownie.
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
2018-04-12 12:29:13
Python 2.7 Na Amazon EC2 z centOS 7
Musiałem ustawić zmienną env SSL_CERT_DIR
, aby wskazywała mój ca-bundle
, który znajdował się w /etc/ssl/certs/ca-bundle.crt
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
2018-05-18 22:40:41
W Pythonie 2.7 dodawanie Trusted root CA na końcu pliku C:\Python27\lib\site-packages\certifi\cacert.pem helped
Po tym uruchomiłem (korzystając z praw admina) pip install --trusted-host pypi.python.org --trusted-host pypi.org --trusted-host files.pythonhosted.org Nazwa pakietu
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
2018-08-28 05:54:39
ln -s /usr/local/share/certs/ca-root-nss.crt /etc/ssl/cert.pem
(FreeBSD 10.1
)
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-03-13 17:08:48