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




ignore urllib2 (19)

Se si è su vCenter 6, è necessario invece aggiungere il cert dell'autorità di certificazione vmware di vCenter all'elenco di CA attendibili del proprio sistema operativo. Per scaricare il tuo cert fai quanto segue

  1. Apri il tuo browser web.
  2. Vai a https: //
  3. Nell'angolo in basso a destra, fare clic sul collegamento Scarica CA attendibile

Su Fedora

  1. decomprimere e modificare l'estensione da .0 a .cer
  2. Copialo in / etc / pki / ca-trust / source / anchor /
  3. eseguire il comando update-ca-trust.

link:

  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

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?


Puoi provare ad aggiungerlo alle variabili di ambiente:

PYTHONHTTPSVERIFY=0 

Se si desidera ignorare la verifica, è possibile creare un nuovo SSLContext . Per impostazione predefinita, i contesti appena creati utilizzano CERT_NONE .

Prestare attenzione a questo come indicato nella sezione 17.3.7.2.1

Quando si chiama direttamente il costruttore SSLContext, CERT_NONE è l'impostazione predefinita. Dal momento che non autentica l'altro peer, può essere insicuro, specialmente in modalità client dove la maggior parte delle volte desideri garantire l'autenticità del server con cui stai parlando. Pertanto, in modalità client, si consiglia vivamente di utilizzare CERT_REQUIRED.

Ma se vuoi solo che funzioni ora per qualche altro motivo puoi fare quanto segue, dovrai 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)

Questo dovrebbe aggirare il tuo problema, ma non stai davvero risolvendo nessuno dei problemi, ma non vedrai [SSL: CERTIFICATE_VERIFY_FAILED] perché ora non stai verificando il certificato!

Per aggiungere a quanto sopra, se vuoi sapere di più sul perché stai vedendo questi problemi, vorrai dare un'occhiata a PEP 476 .

Questo PEP propone di abilitare la verifica delle firme dei certificati X509, nonché la verifica del nome host per i client HTTP di Python per impostazione predefinita, soggetto a opt-out su base per chiamata. Questa modifica verrebbe applicata a Python 2.7, Python 3.4 e Python 3.5.

C'è un opt-out consigliato che non è dissimile dal mio consiglio di cui sopra:

import ssl

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

Dispone anche di un'opzione molto scoraggiata tramite monkeypatching che non si vede spesso in python:

import ssl

ssl._create_default_https_context = ssl._create_unverified_context

Che sovrascrive la funzione predefinita per la creazione del contesto con la funzione per creare un contesto non verificato.

Se vuoi leggere un articolo sul perché non convalidare i certificati è sbagliato nel software , puoi trovarlo qui !


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

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 .


Su Windows, Python non controlla il certificato di sistema, ne usa il proprio che si trova in ?\lib\site-packages\certifi\cacert.pem .

La soluzione al tuo problema:

  1. scarica il certificato di convalida del dominio come * .crt o * pem file
  2. apri il file nell'editor e copia il suo contenuto negli appunti
  3. trova la tua posizione cacert.pem : from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH) from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH)
  4. modificare il file cacert.pem e incollare il certificato di convalida del dominio alla fine del file.
  5. Salva il file e goditi le richieste!

La mia soluzione per Mac OS X:

1) Eseguire l'aggiornamento a Python 3.6.5 utilizzando l'applicazione di installazione Python nativa scaricata dal sito web ufficiale Python in lingua https://www.python.org/downloads/

Ho trovato che questo programma di installazione si sta occupando di aggiornare i link e i collegamenti simbolici per il nuovo Python molto meglio di homebrew.

2) Installa un nuovo certificato usando "./Install Certificates.command" che si trova nella directory Python 3.6 aggiornata

> cd "/Applications/Python 3.6/"
> sudo "./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")

Dare un'occhiata a

/ Applicazioni / Python 3.6 / Installa Certificates.command

Puoi anche andare su Aplications e fare clic su Certificates.command


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

Tratto da qui https://gist.github.com/michaelrice/a6794a017e349fc65d01


Ho risolto questo problema chiudendo Fiddler (un proxy di debug HTTP) se hai un proxy abilitato e riprova.


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


installazione di passaggi per nltk (avevo python3 (3.6.2) installato già in MAC OS X

sudo easy_install pip

usa ignora l'opzione installata per ignorare la disinstallazione della versione precedente di sei, altrimenti dà un errore durante la disinstallazione e non proietta avanti

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

Controlla l'installazione di pip e python, usa le versioni '3'

which python python2 python3
which pip pip2 pip3

Controlla se NLTK è installato

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

Installa il certificato SSL prima di installare il libro degli esempi, altrimenti verificheremo l'errore durante l'installazione degli esempi

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

Questo ha completato l'installazione con successo di nltk e nltk_ata per gli esempi di libri


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/


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

pip install PyOpenSSL

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

( FreeBSD 10.1 )


Provare

pip installa --trusted-host pypi.python.org nomepacchetto

Ha funzionato per me.


Per Python 3.4+ su Centos 6/7 , Fedora , basta installare la CA di fiducia in questo modo:

  1. Copia il file CA.crt in /etc/pki/ca-trust/source/anchors/
  2. update-ca-trust force-enable
  3. update-ca-trust extract





python-2.7 ssl ssl-certificate urllib osx-yosemite