python - Error urllib y "SSL: CERTIFICATE_VERIFY_FAILED"
python-2.7 ssl-certificate (30)
Solución para Anaconda
Mi configuración es Anaconda Python 3.7 en MacOS con un proxy. Los caminos son diferentes.
- Así es como se obtiene la ruta de certificados correcta :
urlopen error [SSL: CERTIFICATE_VERIFY_FAILED]
que en mi sistema produjo
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
Una vez que sepa dónde va el certificado, concatene el certificado utilizado por el proxy al final de ese archivo.
Ya había configurado conda para trabajar con mi proxy, ejecutando:
port install openssl
Si no recuerda dónde está su certificado, puede encontrarlo en
~/.condarc
:
import ssl
ssl.get_default_verify_paths()
Ahora
concatene
ese archivo al final de
/miniconda3/ssl/cert.pem
y las solicitudes deberían funcionar, y en particular
sklearn.datasets
y herramientas similares deberían funcionar.
Advertencias adicionales
Las otras soluciones no funcionaron porque la configuración de Anaconda es ligeramente diferente:
-
La ruta
Applications/Python/ 3.X
simplemente no existe. -
La ruta proporcionada por los siguientes comandos es la ruta INCORRECTA
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'')
Estoy teniendo el siguiente error:
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)>
Este es el código que está causando este error:
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)
La API que estoy usando requiere que use HTTPS. ¿Cómo puedo hacer que omita la verificación?
instalando pasos para nltk (ya tenía python3 (3.6.2) instalado en MAC OS X
pip install certifi
use ignorar la opción instalada para ignorar la desinstalación de la versión anterior de seis, de lo contrario, da un error durante la desinstalación y no avanza la película
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
Verifique la instalación de pip y python, use las versiones ''3''
sudo pip3 install -U pyopenssl
sudo pip3 install certifi
Compruebe si NLTK está instalado
import requests
from requests.auth import HTTPBasicAuth
import certifi
auth = HTTPBasicAuth(''username'', ''password'')
body = {}
r = requests.post(url=''https://your_url.com'', data=body, auth=auth, verify=''/usr/lib/python3.6/site-packages/certifi/cacert.pem'')
Instale el certificado SSL antes de instalar el libro de ejemplos, de lo contrario, certificaremos el error al instalar los ejemplos
ERROR: requests 2.21.0 has requirement urllib3<1.25,>=1.21.1, but you''ll have urllib3 1.25 which is incompatible.
Eso completó la instalación con éxito de nltk y nltk_ata para ejemplos de libros
Al igual que usted, estoy usando Python 2.7 en mi antiguo iMac (OS X 10.6.8), también encontré el problema, usando urllib2.urlopen:
conda config --set ssl_verify <pathToYourFile>.crt
Mis programas funcionaban bien sin problemas con el certificado SSL y de repente (después de descargar programas), se bloquearon con este error SSL.
El problema era la versión de python utilizada:
-
No hay problema con https://www.python.org/downloads y python-2.7.9-macosx10.6.pkg
-
problema con el instalado por la herramienta Homebrew : "brew install python", versión ubicada en / usr / local / bin.
Un capítulo, llamado
Certificate verification and OpenSSL [CHANGED for Python 2.7.9]
, en
/Applications/Python 2.7/ReadMe.rtf
explica el problema con muchos detalles.
Por lo tanto, verifique, descargue y ponga en su RUTA la versión correcta de python.
Como he escrito en un comentario, este problema probablemente esté relacionado con esta respuesta SO .
En resumen: hay varias formas de verificar el certificado. La verificación utilizada por OpenSSL es incompatible con los certificados raíz de confianza que tiene en su sistema. OpenSSL es utilizado por Python.
Puede intentar obtener el certificado que falta para
la Autoridad de certificación primaria pública de Verisign Clase 3
y luego usar la opción
cafile
acuerdo con la
documentación de Python
:
urllib2.urlopen(req, cafile="verisign.pem")
Cuelgo la cabeza con vergüenza, ya que tuve el mismo problema, excepto que en mi caso, la URL que estaba presionando era válida, el certificado era válido.
Lo que no era válido era mi conexión a la web.
No pude agregar detalles de proxy en el navegador (IE en este caso).
Esto evitó que el proceso de verificación ocurriera correctamente.
Agregado en los detalles del proxy y mi python estaba muy feliz.
Echa un vistazo a
/ Aplicaciones / Python 3.6 / Instalar certificados.command
También puede ir a Aplicaciones y hacer clic en Certificados.com
En Python 2.7, agregar los detalles de CA raíz de confianza al final en el archivo C: / Python27 / lib / site-packages / certifi / cacert.pem ayudó
después de eso ejecuté (usando derechos de administrador) pip install --trusted-host pypi.python.org --trusted-host pypi.org --trusted-host files.pythonhosted.org packageName
En Windows, Python no mira el certificado del sistema, usa el suyo ubicado en
?/lib/site-packages/certifi/cacert.pem
.
La solución a tu problema:
- descargue el certificado de validación de dominio como archivo * .crt o * pem
- abra el archivo en el editor y copie su contenido al portapapeles
-
encuentre su ubicación
cacert.pem
:from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH)
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)
-
edite el archivo
cacert.pem
y pegue su certificado de validación de dominio al final del archivo. - ¡Guarde el archivo y disfrute de las solicitudes!
En mi caso, recibí este error porque las
requests
y
urllib3
versiones de
urllib3
eran incompatibles, dando el siguiente error durante la instalación:
which python python2 python3
which pip pip2 pip3
python3
import nltk
nltk.__path__
[''/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/nltk'']
Hizo el truco.
Esta no es una solución a su problema específico, pero lo pongo aquí porque este hilo es el principal resultado de Google para "SSL: CERTIFICATE_VERIFY_FAILED", y me llevó a una loca búsqueda.
Si instaló Python 3.6 en OSX y obtiene el error "SSL: CERTIFICATE_VERIFY_FAILED" cuando intenta conectarse a un sitio https: //, probablemente sea porque Python 3.6 en OSX no tiene ningún certificado y no puede validar ningún SSL conexiones
Este es un cambio para 3.6 en OSX, y requiere un paso posterior a la instalación, que instala el paquete de certificados
certifi
.
Esto está documentado en el archivo Léame, que debe encontrar en
/Applications/Python/ 3.6/ReadMe.rtf
ReadMe le pedirá que ejecute este script posterior a la instalación, que solo instala
certifi
:
/Applications/Python/ 3.6/Install/ Certificates.command
Las notas de la versión tienen más información: https://www.python.org/downloads/release/python-360/
He encontrado esto por here
Encontré esta solución, inserte este código al comienzo de su archivo fuente:
sudo pip3 install -U nltk --ignore-installed six
Este código deshace la verificación para que no se verifique la certificación SSL.
Instalar
PyOpenSSL
usando
pip
funcionó para mí (sin convertirlo a PEM):
pip install ''urllib3<1.25'' --force-reinstall
Instalar certifi en Mac resolvió mi problema:
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'')
Me sorprende que todas estas instrucciones no hayan resuelto mi problema. No obstante, el diagnóstico es correcto (por cierto, estoy usando Mac y Python3.6.1). Entonces, para resumir la parte correcta:
- En Mac, Apple está dejando caer OpenSSL
- Python ahora usa su propio conjunto de certificado raíz de CA
- La instalación binaria de Python proporcionó una secuencia de comandos para instalar el certificado raíz de CA que necesita Python ("/ Aplicaciones / Python 3.6 / Instalar Certificados.command")
- Lea "/ Aplicaciones / Python 3.6 / ReadMe.rtf" para más detalles
Para mí, el script no funciona, y todas esas instalaciones de certifi y openssl también fallaron. Tal vez porque tengo múltiples instalaciones de python 2 y 3, así como muchas virtualenv. Al final, necesito arreglarlo a mano.
ssl_verify: <pathToYourFile>.crt
Si eso todavía te falla. Luego vuelva a instalar OpenSSL también.
from requests.utils import DEFAULT_CA_BUNDLE_PATH
DEFAULT_CA_BUNDLE_PATH
Mi solución para Mac OS X:
1) Actualice a Python 3.6.5 usando la aplicación nativa Instalador de Python descargado del sitio web oficial del lenguaje Python https://www.python.org/downloads/
Descubrí que este instalador se encarga de actualizar los enlaces y enlaces simbólicos para el nuevo Python mucho mejor que homebrew.
2) Instale un nuevo certificado usando "./Install Certificates.command" que se encuentra en el directorio actualizado de Python 3.6
> cd "/Applications/Python 3.6/"
> sudo "./Install Certificates.command"
Necesito agregar otra respuesta porque, al igual que Craig Glennie, me puse loca por las muchas publicaciones que se refieren a este problema en la Web.
Estoy usando MacPorts, y lo que originalmente pensé que era un problema de Python era de hecho un problema de MacPorts: no instala un certificado raíz con su instalación de openssl.
La solución es
port install curl-ca-bundle
, como se menciona en
esta publicación de blog
.
Para Python 3.4+ en Centos 6/7 , Fedora , simplemente instale la CA confiable de esta manera:
-
Copie el archivo CA.crt en
/etc/pki/ca-trust/source/anchors/
-
update-ca-trust force-enable
-
update-ca-trust extract
Para ampliar la respuesta de Craig Glennie:
en Python 3.6.1 en MacOs Sierra
Ingresar esto en la terminal bash resolvió el problema:
pip install certifi
/Applications/Python/ 3.6/Install/ Certificates.command
Para cualquier persona que use
mechanize
que se encuentre con esta pregunta, así es como puede aplicar la misma técnica a una instancia de Mechanize Browser:
>>> 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'')
Podría intentar agregar esto a sus variables de entorno:
PYTHONHTTPSVERIFY=0
Tenga en cuenta que esto deshabilitará toda la verificación HTTP, por lo que es un poco un enfoque de mazo, sin embargo, si no se requiere verificación, puede ser una solución efectiva.
Python 2.7 en Amazon EC2 con centOS 7
Tuve que configurar la variable env
SSL_CERT_DIR
para que apunte a mi
ca-bundle
que estaba ubicado en
/etc/ssl/certs/ca-bundle.crt
Python 2.7.12 (predeterminado, 29 de julio de 2016, 15:26:22) solucionó el problema mencionado. Esta información puede ayudar a alguien más.
Resolví este problema cerrando Fiddler (un proxy de depuración de HTTP) compruebe si tiene un proxy habilitado e intente nuevamente.
Si solo desea omitir la verificación, puede crear un nuevo SSLContext . Por defecto, los contextos recién creados usan CERT_NONE .
Tenga cuidado con esto como se indica en la sección 17.3.7.2.1
Al llamar al constructor SSLContext directamente, CERT_NONE es el valor predeterminado. Dado que no autentica al otro par, puede ser inseguro, especialmente en modo cliente, donde la mayoría de las veces le gustaría garantizar la autenticidad del servidor con el que está hablando. Por lo tanto, cuando está en modo cliente, se recomienda usar CERT_REQUIRED.
Pero si solo quiere que funcione ahora por alguna otra razón, puede hacer lo siguiente, también tendrá que
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() # Only for gangstars
info = urllib2.urlopen(req, context=gcontext).read()
Message.Chat.SendMessage ("" + info)
Esto debería solucionar su problema, pero en realidad no está resolviendo ninguno de los problemas, ¡pero no verá el
[SSL: CERTIFICATE_VERIFY_FAILED]
porque ahora no está verificando el certificado!
Para agregar a lo anterior, si desea saber más acerca de por qué está viendo estos problemas, querrá echar un vistazo a PEP 476 .
Este PEP propone habilitar la verificación de las firmas del certificado X509, así como la verificación del nombre de host para los clientes HTTP de Python de forma predeterminada, sujeto a la exclusión voluntaria por llamada. Este cambio se aplicaría a Python 2.7, Python 3.4 y Python 3.5.
Hay una opción de exclusión voluntaria que no es diferente a mi consejo anterior:
import ssl
# This restores the same behavior as before.
context = ssl._create_unverified_context()
urllib.urlopen("https://no-valid-cert", context=context)
También presenta una opción altamente desaconsejada a través de monkeypatching que no se ve a menudo en python:
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
Que anula la función predeterminada para la creación de contexto con la función para crear un contexto no verificado.
Tenga en cuenta esto como se indica en el PEP:
Esta guía está dirigida principalmente a los administradores de sistemas que desean adoptar versiones más recientes de Python que implementen este PEP en entornos heredados que aún no admiten la verificación de certificados en conexiones HTTPS. Por ejemplo, un administrador puede optar por no agregar el parche de mono anterior a sitecustomize.py en su entorno operativo estándar para Python. Las aplicaciones y las bibliotecas NO DEBEN estar ampliando este proceso de cambio (excepto tal vez en respuesta a una configuración de configuración controlada por el administrador del sistema).
Si desea leer un documento sobre por qué no validar los certificados es malo en el software, ¡puede encontrarlo aquí !
Si está en vCenter 6, debe agregar el certificado de autoridad de certificación vmware de vCenter a la lista de CA de confianza de su sistema operativo. Para descargar su certificado haga lo siguiente
- Abre tu navegador web.
- Navega a https: //
- En la esquina inferior derecha, haga clic en el enlace Descargar Trusted Root CA
En Fedora
- descomprima y cambie la extensión de .0 a .cer
- Cópielo en / etc / pki / ca-trust / source / anchors /
- ejecute el comando update-ca-trust.
Enlaces:
Tenía un problema similar, aunque estaba usando
urllib.request.urlopen
en
Python 3.4, 3.5 y 3.6
.
(Esta es una parte del equivalente en Python 3 de
urllib2
, según la nota al
urllib2
página de documentación de
urllib2
de Python 2).
Mi solución fue
pip install certifi
para instalar
certifi
, que tiene:
... una colección cuidadosamente seleccionada de certificados raíz para validar la confiabilidad de los certificados SSL mientras se verifica la identidad de los hosts TLS.
Luego, en mi código donde anteriormente tenía:
import urllib.request as urlrq
resp = urlrq.urlopen(''https://foo.com/bar/baz.html'')
Lo revisé a:
import urllib.request as urlrq
import certifi
resp = urlrq.urlopen(''https://foo.com/bar/baz.html'', cafile=certifi.where())
Si leo la
documentación de
urllib2.urlopen
correctamente, también tiene un argumento
cafile
.
Entonces,
urllib2.urlopen([...], certifi.where())
podría funcionar para Python 2.7.
Tratar
pip install --trusted-host nombre del paquete pypi.python.org
A mi me funciono.
Tuve un problema similar en una de mis máquinas Linux. Generar nuevos certificados y exportar una variable de entorno que apunta al directorio de certificados lo arregló para mí:
sudo easy_install pip
Otra solución de Anaconda. Estaba obteniendo CERTIFICATE_VERIFY_FAILED en mi entorno Python 2.7 en macOS. Resulta que los caminos de conda eran malos:
entorno base (3.7):
/Applications/Python/ 3.6/Install/ Certificates.command
python3 -m nltk.downloader book
2.7 entorno (¡las rutas no existían!):
pip install PyOpenSSL
La solución:
br = mechanize.Browser()
context = ssl._create_unverified_context()
br.set_ca_data(context=context)
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
Tomado de aquí https://gist.github.com/michaelrice/a6794a017e349fc65d01