urllib e errore "SSL: CERTIFICATE_VERIFY_FAILED"


279

Ricevo il seguente 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 causa 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 utilizzando mi richiede di utilizzare HTTPS. Come posso fare per bypassare la verifica?


2
Non c'è nulla di sbagliato nell'URL e può essere verificato con successo con i certificati affidabili comuni. Quindi è meglio non tentare di aggirare la convalida del certificato, ma di risolverlo. Quale versione di Python stai usando?
Steffen Ullrich

Ciò potrebbe essere correlato a stackoverflow.com/a/27826829/3081018 . Il server utilizza lo stesso tipo di catena di certificati con più percorsi di attendibilità. Vedi lì quale caffetteria potresti dover utilizzare per la verifica.
Steffen Ullrich

7
Questo errore si verifica anche su Python 3.5 dopo l'aggiornamento a yosemite
pyCthon

2
Questo spiega la situazione. access.redhat.com/articles/2039753
Charlie Burns,

4
"Come posso fare per bypassare la verifica?" è la domanda sbagliata. Probabilmente dovresti chiedere come convalidare il certificato fornito dal dominio.
jww

Risposte:


297

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

Prestare attenzione a quanto 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, soprattutto in modalità client in cui il più delle volte si desidera garantire l'autenticità del server con cui si sta 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 sslanche:

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)

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 saperne di più sul perché stai vedendo questi problemi, ti consigliamo di 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, previa opt-out su base per chiamata. Questa modifica verrebbe applicata a Python 2.7, Python 3.4 e Python 3.5.

Esiste un opt-out consigliato che non è dissimile dal mio consiglio sopra:

import ssl

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

Presenta anche un'opzione altamente scoraggiata tramite il monkeypatching che non si vede spesso in Python:

import ssl

ssl._create_default_https_context = ssl._create_unverified_context

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

Si prega di notare come indicato nel PEP:

Questa guida è rivolta principalmente agli amministratori di sistema che desiderano adottare versioni più recenti di Python che implementano questo PEP in ambienti legacy che non supportano ancora la verifica dei certificati su connessioni HTTPS. Ad esempio, un amministratore può annullare l'aggiunta aggiungendo il monkeypatch sopra a sitecustomize.py nel proprio ambiente operativo standard per Python. Le applicazioni e le librerie NON DOVREBBERO rendere ampia questa procedura di modifica (tranne forse in risposta a un'impostazione di configurazione controllata dall'amministratore di sistema).

Se vuoi leggere un documento sul perché non convalidare certs è un male nel software , puoi trovarlo qui !


1
Quindi se questo errore mi impedisce di utilizzare setup.py uploadcome posso risolverlo?
pyCthon,

5
ssl._create_default_https_context = ssl._create_unverified_context questo ha funzionato per me come menzionato da Noelkd verso la fine. Dato che il nostro è un sito intranet per stampanti HP ... utilizzato esclusivamente per lo scraping ... non abbiamo problemi con l'utilizzo di questo metodo.
ihightower,

Il primo metodo è quello meno desiderabile: la convalida del bypass. Perché quello che effettivamente convalida il certificato non è elencato per primo?
jww

1
questo può succedere anche se hai una versione obsoleta di openSSL. Quindi per me ciò che ha funzionato è stato l'aggiornamento alla versione più recente certifi e l'aggiornamento di openssl sulle scatole.
myusuf3,

1
context è ciò di cui avevo bisogno
prayagupd,

382

Questa non è una soluzione al tuo problema specifico, ma lo sto mettendo qui perché questo thread è il miglior risultato di Google per "SSL: CERTIFICATE_VERIFY_FAILED", e mi guida in una caccia all'oca selvatica.

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

Il file Leggimi ti farà eseguire questo script post-installazione, che installa solo certifi:/Applications/Python\ 3.6/Install\ Certificates.command

Le note di rilascio hanno qualche informazione in più: https://www.python.org/downloads/release/python-360/


105
Esegui direttamente / Applicazioni / Python \ 3.6 / Installa \ Certificates.com e risolvi il mio problema su OSX. Grazie.
muyong,

2
Sto usando OS X El Capitan 10.11.6, Python 3.6.0 e questa soluzione ha funzionato perfettamente.
y2knoproblem,

2
Sto usando macOS Sierra 10.12.5, Python 3.6.1 e questa soluzione ha funzionato perfettamente.
James,

4
Questo l'ha risolto per me /Applications/Python\ 3.7/Install\ Certificates.command eseguendolo direttamente terminal! Grazie @CraigGlennie & @muyong Apprezzo il fatto di averlo out-of-the-box-thinkinginserito qui!
JayRizzo,

6
Python 3.7 su macOS Mojave: non funziona qui. Ho disinstallato / reinstallato / eseguito il certificato di installazione, riavviato, ecc. Non funziona per me
Thomas

71

Per espandere la risposta di Craig Glennie:

in Python 3.6.1 su Sierra MacOs

Inserendolo nel terminale bash il problema è stato risolto:

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

3
prova sudo /Applications/Python\ 3.6/Install\ Certificates.commandse le autorizzazioni sono negate.
KingKongCoder

Questo in realtà non risolve il problema su Python 3.6. -1
hyperum

1
Se usi la riga di comando ti fa impazzire (probabilmente non se sei qui, ma ehi), puoi anche trovare la cartella Applicazioni (o equivalente su altri sistemi operativi) che Python ha creato durante l'installazione, quindi apri lo script facendo doppio clic. Il nome specifico della cartella dipende dalla versione di Python installata.
Erdős-Bacon,

Ha funzionato come un incantesimo per Python 3.7.3. Grazie.
Klbytec,

Grazie. Ho letteralmente cercato centinaia di soluzioni e il tuo ha funzionato.
nnd

43

Su Windows, Python non esamina il certificato di sistema, utilizza il proprio situato in ?\lib\site-packages\certifi\cacert.pem.

La soluzione al tuo problema:

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

6
lib\site-packages\certifi\cacert.pemnon esiste in Python 2.7.10. E la domanda urllib2non èrequests
Kevin Smyth,

2
La migliore soluzione finora, l'API di twitter utilizza il certificato DigiCert che non si trova nel file cacert.pem del mio python. Ho aggiunto lì e VOILA!
digz6666,

2
Ha lavorato su Debian. Per la cronaca, il percorso del file sul mio sistema è stato: /usr/local/lib/python2.7/dist-packages/certifi-2015.09.06.2-py2.7.egg/certifi/cacert.pem. Grazie!
ofavre

Sfortunatamente le richieste di Python non usano alcun trust store della CA del sistema operativo. github.com/requests/requests/issues/2966 . Devi impostare REQUESTS_CA_BUNDLE github.com/bloomreach/s4cmd/issues/111#issuecomment-406839514 .
jamshid,

Funziona su Windows 10, Python 3.6, con le API di Google e Twitter e il modulo richieste in generale.
brittenb,

36

La mia soluzione per Mac OS X:

1) Esegui l'upgrade a Python 3.6.5 utilizzando il programma di installazione dell'app Python nativa scaricato dal sito Web ufficiale della lingua Python https://www.python.org/downloads/

Ho scoperto che questo programma di installazione si occupa di aggiornare i collegamenti 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"

Ha funzionato come un incantesimo in Mac OS X.
Manu mathew

31

Potresti provare ad aggiungere questo alle variabili di ambiente:

PYTHONHTTPSVERIFY=0 

Nota che questo disabiliterà tutta la verifica HTTP, quindi è un approccio un po 'mazza, tuttavia se la verifica non è richiesta potrebbe essere una soluzione efficace.


17
Sospetto che disabilitare tutta la verifica HTTP per tutto di Python sia un po 'eccessivo per gestire un errore di verifica. Ci sono molti casi in cui si potrebbe desiderare la verifica di default.
trevorKirkby il

Ha funzionato per me su Windows Server 2016 su Python 2.7.13. Normalmente non ho installato Python su server Windows ma ne avevo bisogno per un aggiornamento di vCenter con Nexus 1000v migrazione a VDS, e questo risolve il problema con un certificato vCenter autofirmato per il momento (utilizzerà VMCA e certificati validi in ambiente aggiornato). Non ho avuto fortuna a far accettare il certificato modificando cacert.pem nel pacchetto di richieste di Python
Christopher Thorjussen,

3
Inoltre, ho impostato la variabile direttamente nella finestra della riga di comando prima di eseguire lo script, quindi non disabiliterà tutti i controlli come @ qualcuno o l'altro hanno paura, che anch'io non consiglierei.
Christopher Thorjussen,

È perfetto per il mio caso d'uso: test. Non lo farei mai in produzione, ma per l'esecuzione di test che non hanno nulla a che fare con SSL, questa è un'opzione meravigliosa.
sorin,

Grazie, questa soluzione l'ha fatto per me: import os os.environ ["PYTHONHTTPSVERIFY"] = "0"
mbello

28

Avevo un problema simile, sebbene stavo usando urllib.request.urlopenin Python 3.4, 3.5 e 3.6 . (Questa è una parte dell'equivalente di Python 3 di urllib2, per la nota in testa alla pagina della documentazione di Python 2urllib2 ).

La mia soluzione era pip install certifiinstallare certifi, che ha:

... una raccolta accuratamente curata di certificati di root per convalidare l'affidabilità dei certificati SSL, verificando al contempo l'identità degli host TLS.

Quindi, nel mio codice in cui in precedenza avevo appena avuto:

import urllib.request as urlrq

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

L'ho modificato per:

import urllib.request as urlrq
import certifi

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

Se ho letto correttamente la urllib2.urlopendocumentazione , ha anche un cafileargomento. Quindi, urllib2.urlopen([...], certifi.where())potrebbe funzionare anche per Python 2.7.


AGGIORNAMENTO (2020-01-01): A partire da Python 3.6, l' cafileargomento urlopenè stato deprecato , con l' contextargomento che si suppone sia stato specificato invece. Ho trovato quanto segue per funzionare ugualmente bene da 3.5 a 3.8:

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

1
load_verify_locationsmuta l' SSLContextistanza e ritorna None. Dovresti usare context=ssl.create_default_context(cafile=certifi.where())invece. Vedi i ssldocumenti per maggiori informazioni.
ostrokach,

1
@ostrokach Huh, ho provato qualcosa del genere, ma devo aver usato la sslfunzione sbagliata . Vedi modifica; ok?
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

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


testato questa soluzione in ambiente Jenkins, ambiente personale, funziona!
rapport89,

2
Questo è estremamente pericoloso in quanto ignora TUTTA la verifica del certificato, utilizza a proprio rischio e per amore di QUALUNQUE non utilizzarlo nel codice di produzione.
dragon788,

Grazie. Finalmente ha funzionato. Non è necessario che Python 3.6 sia installato in / Applicazioni su Mac OS. Questa dovrebbe essere la risposta accettata.
Biranchi,

Non dovresti mai fare un tale monkeypatching. È estremamente pericoloso e influirà sull'uso a valle del codice.
Acumenus,

10

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

In breve: esistono diversi modi per verificare il certificato. La verifica utilizzata da OpenSSL non è compatibile con i certificati radice attendibili che hai sul tuo sistema. OpenSSL è utilizzato da Python.

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

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

Potete aiutarmi a risolvere questo problema rilevante nel collegamento di
Nessuno

8

Ho avuto un problema simile su una delle mie macchine Linux. La generazione di nuovi certificati e l'esportazione di una variabile di ambiente che punta alla directory dei certificati mi ha risolto:

$ sudo update-ca-certificates --fresh
$ export SSL_CERT_DIR=/etc/ssl/certs

7

Ho bisogno di aggiungere un'altra risposta perché, proprio come Craig Glennie, sono andato a caccia di un'oca selvatica a causa dei molti post che si riferivano a questo problema sul Web.

Sto usando MacPorts e quello che inizialmente pensavo fosse un problema di Python era in realtà un problema di 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 sul blog .


5

L'ho trovato qui

Ho trovato questa soluzione, inserire questo codice all'inizio del file sorgente:

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

Questo codice rende la verifica annullata in modo che la certificazione SSL non sia verificata.


guarda questo video mi ha aiutato molto a capire cos'è ssl. URL del video: youtu.be/dsuVPxuU_hc
Ganesh Chowdhary Sadanala

4

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

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

2
Può essere una domanda stupida, ma cos'è CA.crt e dove posso trovarlo?
Iqbal,

4

Soluzione per Anaconda

La mia configurazione è Anaconda Python 3.7 su MacOS con un proxy. I percorsi sono diversi.

  • Ecco come ottenere il percorso dei certificati corretto :
import ssl
ssl.get_default_verify_paths()

che sul mio sistema ha prodotto

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

Una volta che sai dove va il certificato, allora concatenate il certificato utilizzato dal proxy alla fine di quel file.

Avevo già impostato conda per funzionare con il mio proxy, eseguendo:

conda config --set ssl_verify <pathToYourFile>.crt

Se non ricordi dove si trova il tuo certificato, puoi trovarlo in ~/.condarc:

ssl_verify: <pathToYourFile>.crt

Ora concatena quel file fino alla fine /miniconda3/ssl/cert.pem e le richieste dovrebbero funzionare, e in particolaresklearn.datasets strumenti simili dovrebbero funzionare.

Ulteriori avvertenze

Le altre soluzioni non hanno funzionato perché la configurazione di Anaconda è leggermente diversa:

  • Il percorso Applications/Python\ 3.Xsemplicemente non esiste.

  • Il percorso fornito dai comandi seguenti è il percorso SBAGLIATO

from requests.utils import DEFAULT_CA_BUNDLE_PATH
DEFAULT_CA_BUNDLE_PATH

3

Pendo la testa in semi-vergogna, dato che avevo 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 i dettagli del proxy nel browser (IE in questo caso). Ciò ha impedito il corretto processo di verifica.
Aggiunto nei dettagli del proxy e il mio pitone è stato molto felice.


1
Non pendere la testa nella vergogna per aver dimenticato qualcosa e poi averlo capito e condiviso, qualcuno potrebbe trovarlo utile. Utilizzando IE però ... peccato: p
Davos

3

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


3
L'ho incontrato il 2.7.12 su Mac, usando la libreria urllib2, però l'uso della libreria requets sembra soddisfacente
marcadian

@marcadian L'installazione e l'utilizzo certifi, che a quanto pare è uno scrap dei certificati detenuti da requests, hanno risolto il problema su Python da 3.4 a 3.6 .
hBy2Py

3

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

  • Su Mac, Apple rilascia OpenSSL
  • Python ora utilizza il proprio set di certificati radice CA.
  • L'installazione di Binary Python ha fornito uno script per installare il certificato di CA Root di cui Python ha bisogno ("/ Applicazioni / Python 3.6 / Installa certificati.com")
  • Leggi "/ Applicazioni / Python 3.6 / ReadMe.rtf" per i dettagli

Per me, lo script non funziona e anche tutte quelle installazioni di certifi e openssl non sono state riparate. Forse perché ho più installazioni di Python 2 e 3, oltre a molte virtualenv. Alla fine, devo 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 non ci riesci. Quindi reinstallare / installare anche OpenSSL.

port install openssl

2

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

urlopen error [SSL: CERTIFICATE_VERIFY_FAILED]

I miei programmi funzionavano bene senza problemi di certificato SSL e in seguito (dopo aver scaricato i programmi), si bloccarono con questo errore SSL.

Il problema era la versione di Python utilizzata:

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

  2. problema con quello installato dallo strumento Homebrew : "brew install python", versione che si trova 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 nel tuo PERCORSO la versione giusta di Python.


2

Python 2.7 su Amazon EC2 con centOS 7

Ho dovuto impostare la variabile env SSL_CERT_DIRin modo che punti alla mia ca-bundleche si trovava in/etc/ssl/certs/ca-bundle.crt


La tua risposta mi ha portato sulla strada giusta per me. Su Ubuntu, ho dovuto impostare SSL_CERT_DIRa /etc/ssl/certs, e anche fatto in modo che il ca-certificatespacchetto è stato installato e aggiornato.
Norman Breau,


1

Provare

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

Ha funzionato per me.


1

Date un'occhiata al

/ Applicazioni / Python 3.6 / Installa Certificates.command

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


1

Nel mio caso stavo ottenendo questo errore perché requestse le urllib3versioni erano incompatibili, dando il seguente errore durante l'installazione:

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

ha fatto il trucco.


1

Un'altra soluzione Anaconda. Stavo ricevendo CERTIFICATE_VERIFY_FAILED nel mio ambiente Python 2.7 su macOS. Si scopre che i percorsi conda erano cattivi:

ambiente di base (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 ambiente (i percorsi non esistevano!):

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

La correzione:

cd /usr/local/anaconda3/envs/py27/
mkdir ssl
cd ssl
ln -s ../../../ssl/cert.pem

1

L'errore SSL: CERTIFICATE_VERIFY_FAILED potrebbe anche verificarsi perché nel ca-certificatespacchetto su Linux manca un certificato intermedio . Ad esempio, nel mio caso mancava nel pacchetto il certificato intermedio " DigiCert SHA2 Secure Server CA " ca-certificatesanche se incluso nel browser Firefox. Puoi scoprire quale certificato è mancante eseguendo direttamente il wgetcomando sull'URL che causa questo errore. Quindi è possibile cercare il collegamento corrispondente al file CRT per questo certificato dal sito Web ufficiale (ad esempio https://www.digicert.com/digicert-root-certificates.htm nel mio caso) dell'Autorità di certificazione. Ora, per includere il certificato mancante nel tuo caso, puoi invece eseguire i comandi seguenti usando il link per il download del file 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

Dopodiché puoi provare di nuovo con il wgettuo URL e usando il urllibpacchetto python . Per maggiori dettagli, consultare: https://bugs.launchpad.net/ubuntu/+source/ca-certificates/+bug/1795242


0

Se sei su vCenter 6, devi invece aggiungere il certificato dell'autorità di certificazione vmware del tuo vCenter all'elenco di CA affidabili del tuo sistema operativo. Per scaricare il certificato, procedi come segue

  1. Apri il tuo browser.
  2. Passare a https: //
  3. Nell'angolo in basso a destra, fai clic sul link Scarica CA radice 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

Ha dichiarato di essere su OS X, non su vCenter 6.
jww

0

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

sudo easy_install pip

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

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 un errore durante l'installazione degli esempi

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

Ciò ha completato con successo l'installazione di nltk e nltk_ata per esempi di libri


0

Installazione PyOpenSSLusando pipfunzionato per me (senza conversione in PEM):

pip install PyOpenSSL

0

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


0

In python 2.7 aggiunta dei dettagli della CA radice attendibile alla fine nel file C: \ Python27 \ lib \ site-pacchetti \ certifi \ cacert.pem aiutato

successivamente ho eseguito (usando i diritti di amministratore) pip install --trusted-host pypi.python.org --trusted-host pypi.org --trusted-host files.pythonhosted.org nomepacchetto

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.