[python-2.7] urllib e errore "SSL: CERTIFICATE_VERIFY_FAILED"



10 Answers

Questa non è una soluzione al tuo problema specifico, ma la sto inserendo qui perché questo thread è il miglior risultato di Google per "SSL: CERTIFICATE_VERIFY_FAILED", e questo mi porta a un inseguimento selvaggio.

Se hai installato Python 3.6 su OSX e ricevi l'errore "SSL: CERTIFICATE_VERIFY_FAILED" quando provi a collegarti a un sito https: //, probabilmente è perché Python 3.6 su OSX non ha alcun certificato e non può validare alcun SSL connessioni. Questa è una modifica per 3.6 su OSX e richiede un passaggio post installazione, che installa il pacchetto certifi di certificati. Questo è documentato nel file Leggimi, che dovresti trovare in /Applications/Python\ 3.6/ReadMe.rtf

Il file Leggimi eseguirà questo script di post-installazione, che installa appena certifi : /Applications/Python\ 3.6/Install\ Certificates.command

Le note di rilascio hanno ulteriori informazioni: https://www.python.org/downloads/release/python-360/

Question

Sto ottenendo questo errore

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

Questo è il codice che sta causando questo errore:

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)

L'API che sto usando mi richiede di usare https. Come faccio a bypassare la verifica?




Come te, sto usando python 2.7 sul mio vecchio iMac (OS X 10.6.8), ho incontrato anche il problema, usando urllib2.urlopen:

urlopen error [SSL: CERTIFICATE_VERIFY_FAILED]

I miei programmi funzionavano bene senza problemi con i certificati SSL e in modo anomalo (dopo aver scaricato programmi), si sono bloccati con questo errore SSL.

Il problema era la versione di python usata:

  1. Nessun problema con https://www.python.org/downloads e python-2.7.9-macosx10.6.pkg

  2. problema con quello instalato dallo strumento Homebrew : "brew install python", versione situata in / usr / local / bin.

Un capitolo, chiamato Certificate verification and OpenSSL [CHANGED for Python 2.7.9] , in /Applications/Python 2.7/ReadMe.rtf spiega il problema con molti dettagli.

Quindi, controlla, scarica e inserisci il tuo PATH nella giusta versione di python.




ln -s /usr/local/share/certs/ca-root-nss.crt /etc/ssl/cert.pem

( FreeBSD 10.1 )




Stavo avendo un problema simile, anche se stavo usando urllib.request.urlopen in Python 3.4, 3.5 e 3.6 . (Questa è una parte dell'equivalente di Python 3 di urllib2 , come da nota in testa alla pagina di documentazione urllib2 di Python 2).

La mia soluzione era pip install certifi per installare certifi , che ha:

... una raccolta accuratamente curata di certificati di root per la convalida dell'affidabilità dei certificati SSL durante la verifica dell'identità degli host TLS.

Quindi, nel mio codice in cui avevo precedentemente avuto:

import urllib.request as urlrq
resp = urlrq.urlopen('https://foo.com/bar/baz.html')

L'ho rivisto per:

import urllib.request as urlrq
import certifi
resp = urlrq.urlopen('https://foo.com/bar/baz.html', cafile=certifi.where())

Se leggo correttamente la documentazione urllib2.urlopen , ha anche un argomento cafile . Quindi, urllib2.urlopen([...], certifi.where()) potrebbe funzionare anche per Python 2.7.




Python 2.7.12 (predefinito, 29 luglio 2016, 15:26:22) ha risolto il problema menzionato. Questa informazione potrebbe aiutare qualcun altro.




Installare PyOpenSSL usando pip funzionato per me (senza convertire in PEM):

pip install PyOpenSSL



Per espandere la risposta di Craig Glennie (scusa non abbastanza reputazione per commentare):

in Python 3.6.1 su MacOs Sierra

Inserendo questo nel terminale bash risolto il problema:

pip install certifi
/Applications/Python\ 3.6/Install\ Certificates.command



Come ho scritto in un commento, questo problema è probabilmente correlato a questa risposta SO .

In breve: ci sono diversi modi per verificare il certificato. La verifica utilizzata da OpenSSL non è compatibile con i certificati radice attendibili presenti nel sistema. OpenSSL è usato da Python.

Potresti provare a ottenere il certificato mancante per l' Autorità di certificazione primaria pubblica di Classe 3 di Verisign e quindi utilizzare l'opzione cafile base alla documentazione di Python :

urllib2.urlopen(req, cafile="verisign.pem")



Mi blocco la testa in semi-vergogna, poiché ho avuto lo stesso problema, tranne che nel mio caso, l'URL che stavo colpendo era valido, il certificato era valido. Ciò che non era valido era la mia connessione al web. Non ero riuscito ad aggiungere dettagli proxy nel browser (in questo caso IE). Ciò ha impedito il corretto svolgimento del processo di verifica.
Aggiunto nei dettagli del proxy e il mio pitone era quindi molto felice.




Ho bisogno di aggiungere un'altra risposta perché proprio come Craig Glennie, sono andato su una caccia all'oca selvaggia a causa dei numerosi post che si riferiscono a questo problema attraverso il Web.

Sto usando MacPorts e quello che pensavo fosse un problema Python era in realtà un problema con MacPorts: non installa un certificato di root con la sua installazione di openssl. La soluzione è port install curl-ca-bundle , come menzionato in questo post del blog .




Sono sorpreso che tutte queste istruzioni non abbiano risolto il mio problema. Tuttavia, la diagnosi è corretta (BTW, sto usando Mac e Python3.6.1). Quindi, per riassumere la parte corretta:

  • Su Mac, Apple sta lasciando cadere OpenSSL
  • Python ora usa il proprio set di CA Root Certificate
  • L'installazione di Binary Python ha fornito uno script per installare il certificato CA Root necessario per Python ("/ Applications / Python 3.6 / Install Certificates.command")
  • Leggi "/ Applicazioni / Python 3.6 / ReadMe.rtf" per i dettagli

Per me, lo script non funziona e tutte quelle installazioni di certifi e openssl non sono riuscite a risolvere il problema. Forse perché ho più installazioni python 2 e 3, oltre a molti virtualenv. Alla fine, ho bisogno di ripararlo a mano.

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

Se ancora ti manca. Quindi re / installa anche OpenSSL.

port install openssl



Related