Error urllib y “SSL: CERTIFICATE_VERIFY_FAILED”

Estoy recibiendo este 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:  

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) 

El uso de API Im requiere que use el https. ¿Cómo puedo hacer que omita la verificación?

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 directamente al constructor SSLContext, CERT_NONE es el valor predeterminado. Como no autentica al otro interlocutor, puede ser inseguro, especialmente en el modo cliente, donde la mayoría de las veces desea garantizar la autenticidad del servidor con el que está hablando. Por lo tanto, cuando se encuentre en modo cliente, se recomienda encarecidamente usar CERT_REQUIRED.

Pero si solo quieres que funcione ahora por alguna otra razón, puedes hacer lo siguiente, también tendrás 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(ssl.PROTOCOL_TLSv1) # Only for gangstars info = urllib2.urlopen(req, context=gcontext).read() Message.Chat.SendMessage ("" + info) 

Esto debería solucionar tu problema, pero no estás resolviendo ninguno de los problemas, pero no verás el [SSL: CERTIFICATE_VERIFY_FAILED] porque no estás verificando el certificado.

Para agregar a lo anterior, si quiere saber más sobre por qué está viendo estos problemas, querrá echarle un vistazo a PEP 476 .

Este PEP propone habilitar la verificación de las firmas de los certificados X509, así como la verificación del nombre de host para los clientes HTTP de Python por defecto, 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 recomendada que no difiere de mi consejo anterior:

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

También presenta una opción muy desalentada 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.

Si desea leer un documento sobre por qué no validar certs es malo en el software , puede encontrarlo aquí .

Esta no es una solución para su problema específico, pero lo estoy planteando aquí porque este hilo es el resultado principal de Google para “SSL: CERTIFICATE_VERIFY_FAILED”, y me lleva a una búsqueda inútil.

Si instaló Python 3.6 en OSX y recibe el error “SSL: CERTIFICATE_VERIFY_FAILED” cuando intenta conectarse a un sitio https: //, es probable que sea porque Python 3.6 en OSX no tiene certificados 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 puede encontrar en /Applications/Python\ 3.6/ReadMe.rtf

El archivo ReadMe hará 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 contienen más información: https://www.python.org/downloads/release/python-360/

En Windows, Python no mira el certificado del sistema, sino que 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 de 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 el certificado de validación de su dominio al final del archivo.
  5. Guarde el archivo y disfrute de las solicitudes!

Para ampliar la respuesta de Craig Glennie (lo siento, no hay suficiente reputación para comentar):

en Python 3.6.1 en MacOs Sierra

Al ingresar esto en la terminal de bash resolvió el problema:

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

Podría intentar agregar esto a sus variables de entorno:

 PYTHONHTTPSVERIFY=0 

Tenga en cuenta que esto deshabilitará todas las verificaciones HTTP, por lo que es un enfoque poco convincente; sin embargo, si no se requiere una verificación, puede ser una solución efectiva.

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 de Python https://www.python.org/downloads/

Descubrí que este instalador se está ocupando de actualizar los enlaces y los 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" 
 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

Como he escrito en un comentario, este problema probablemente esté relacionado con esta respuesta SO .

En resumen: hay múltiples 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.

Podría tratar de obtener el certificado faltante para la Autoridad de Certificación Primaria Pública Verisign Clase 3 y luego usar la opción cafile según la documentación de Python :

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

Estaba teniendo un problema similar, aunque estaba usando urllib.request.urlopen en Python 3.4, 3.5 y 3.6 . (Esta es una porción del equivalente de Python 3 de urllib2 , según la nota en la cabeza de la 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 solo tenía:

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

Lo revisé para:

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

Si leo la documentación urllib2.urlopen correctamente, también tiene un argumento cafile . Por lo tanto, urllib2.urlopen([...], certifi.where()) podría funcionar para Python 2.7.

Para Python 3.4+ en Centos 6/7 , Fedora , simplemente instale la CA confiable de esta manera:

  1. Copie el CA.crt en /etc/pki/ca-trust/source/anchors/
  2. update-ca-trust force-enable
  3. update-ca-trust extract

Cuelgo mi cabeza en semi-vergüenza, ya que tenía el mismo problema, excepto que en mi caso, la URL que estaba golpeando era válida, el certificado era válido. Lo que no era válido era mi conexión a la web. No pude agregar los datos del proxy en el navegador (IE en este caso). Esto detuvo el proceso de verificación de que ocurriera correctamente.
Agregado en los detalles del proxy y mi python fue muy feliz.

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:

 urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] 

Mis progtwigs funcionaban bien sin problemas de certificado SSL y de repente (después de descargar progtwigs), se bloquearon con este error de 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 que instaló 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 coloque en su PATH la versión correcta de python.

Tratar

instalación de pip –trusted-host nombre de paquete pypi.python.org

Funcionó para mí

Estoy sorprendido de 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 deja caer OpenSSL
  • Python ahora usa su propio conjunto de certificados de raíz de CA
  • La instalación de Binary Python proporcionó un script para instalar el certificado de CA Root que necesita Python (“/ Aplicaciones / Python 3.6 / Install Certificates.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 tampoco se corrigieron. Tal vez porque tengo varias instalaciones de python 2 y 3, así como muchas virtualenv. Al final, necesito arreglarlo a mano.

 pip install certifi # for your virtualenv mkdir -p /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl cp -a /site-package/certifi/cacert.pem \ /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/cert.pem 

Si eso todavía te falla. Luego vuelva a instalar OpenSSL también.

 port install openssl 

Necesito agregar otra respuesta porque, al igual que Craig Glennie, me puse a correr de un plumazo debido a 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 en realidad 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 .

Echa un vistazo a

/ Aplicaciones / Python 3.6 / Install Certificates.command

También puede dirigirse a Aplicaciones y hacer clic en Certificates.command

Si está en vCenter 6, en su lugar debe agregar el certificado de la autoridad de certificación vmware de su vCenter a la lista de CA’s confiables de su sistema operativo. Para descargar tu certificado, haz lo siguiente

  1. Abra su navegador web.
  2. Navega a https: //
  3. En la esquina inferior derecha, haz clic en el enlace Descargar CA de raíz de confianza.

En Fedora

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

Campo de golf:

  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

Python 2.7.12 (predeterminado, 29 de julio de 2016, 15:26:22) solucionó el problema mencionado. Esta información puede ayudar a otra persona.

instalando pasos para nltk (ya tenía python3 (3.6.2) instalado en MAC OS X

 sudo easy_install pip 

Utilice la opción ignorar instalada para ignorar la desinstalación de la versión anterior de seis; de lo contrario, genera un error al desinstalar y no reproduce la película.

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

Compruebe la instalación de pip y python, use las versiones ‘3’

 which python python2 python3 which pip pip2 pip3 

Verificar si NLTK está instalado

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

Instale el certificado SSL antes de instalar el libro de ejemplos; de lo contrario, generaremos un error al instalar los ejemplos.

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

Eso completó la instalación con éxito de nltk y nltk_ata para ejemplos de libros

Instalando PyOpenSSL usando pip trabajado para mí (sin convertir a PEM):

 pip install PyOpenSSL 

Tuve este problema resuelto cerrando Fiddler (un proxy de depuración HTTP) compruebe si tiene un proxy habilitado y vuelva a intentarlo.

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

En Python 2.7, la adición de detalles de CA de raíz de confianza al final en el archivo C: \ Python27 \ lib \ site-packages \ certifi \ cacert.pem ayudó

después de eso sí funcioné (usando los derechos de administrador) instalación de pip –trusted-host pypi.python.org –trusted-host pypi.org –trusted-host files.pythonhosted.org packageName

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

( FreeBSD 10.1 )