python python-2.7 ssl ssl-certificate osx-yosemite urllib

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:

  1. No hay problema con https://www.python.org/downloads y python-2.7.9-macosx10.6.pkg

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

  1. descargue el certificado de validación de dominio como archivo * .crt o * pem
  2. abra el archivo en el editor y copie su contenido al portapapeles
  3. 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)
  4. edite el archivo cacert.pem y pegue su certificado de validación de dominio al final del archivo.
  5. ¡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:

  1. Copie el archivo CA.crt en /etc/pki/ca-trust/source/anchors/
  2. update-ca-trust force-enable
  3. 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

  1. Abre tu navegador web.
  2. Navega a https: //
  3. En la esquina inferior derecha, haga clic en el enlace Descargar Trusted Root CA

En Fedora

  1. descomprima y cambie la extensión de .0 a .cer
  2. Cópielo en / etc / pki / ca-trust / source / anchors /
  3. ejecute el comando update-ca-trust.

Enlaces:

  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

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