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

Author: HamZa, 2015-01-08

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!

 195
Author: Noelkd,
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/

 189
Author: Craig Glennie,
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
 25
Author: jnPy,
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:

  1. Pobierz certyfikat walidacji domeny jako *.plik crt lub * pem
  2. otwórz plik w edytorze i skopiuj jego zawartość do schowka
  3. znajdź swoją cacert.pem lokalizację: from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH)
  4. edytuj plik cacert.pem i wklej certyfikat weryfikacji domeny na końcu pliku.
  5. Zapisz plik i ciesz się żądaniami!
 20
Author: Bruno Gabuzomeu,
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.

 20
Author: Chris Halcrow,
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"
 15
Author: Claude COULOMBE,
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

 10
Author: Prostak,
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")
 9
Author: Steffen Ullrich,
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.

 7
Author: hBy2Py,
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:

  1. Kopiuj CA.crt do /etc/pki/ca-trust/source/anchors/
  2. update-ca-trust force-enable
  3. update-ca-trust extract
 4
Author: Cherif KAOUA,
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 .

 3
Author: Ads,
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:

  1. No problem with https://www.python.org/downloads i python-2.7.9-macosx10.6.pkg

  2. 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.

 2
Author: Thierry Maillard,
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.

 2
Author: user3603105,
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
 2
Author: berniey,
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 .

 1
Author: corwin.amber,
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

 1
Author: Danielle Cohen,
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

  1. Otwórz przeglądarkę internetową.
  2. Przejdź do https: / /
  3. w prawym dolnym rogu kliknij link Pobierz zaufany Root CA

Na Fedorze

  1. Rozpakuj i zmień rozszerzenie z .0 do .cer
  2. skopiuj go do pliku/etc / PKI / ca-trust/source/anchors /
  3. Uruchom polecenie update-ca-trust.

Linki:

  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
 0
Author: nobler1050,
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.

 0
Author: caot,
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

 0
Author: Narasimha Sai,
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
 0
Author: averma93,
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.

 0
Author: vperezb,
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

 0
Author: Brian McCall,
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

 0
Author: MD5,
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)

 -4
Author: Aleksei Kostiushenko,
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