Error de InsegurePlatform de SSL al usar el paquete de solicitudes

Estoy usando Python 2.7.3 y Solicitudes. He instalado solicitudes a través de pip. Creo que es la última versión. Estoy corriendo en Debian Wheezy.

He usado las solicitudes muchas veces en el pasado y nunca he enfrentado este problema, pero parece que al realizar solicitudes https con las Requests obtengo una excepción InsecurePlatform .

El error menciona urllib3 , pero no lo tengo instalado. Lo instalé para ver si resolvía el error, pero no lo hizo.

 /usr/local/lib/python2.7/dist-packages/requests/packages/urllib3 /util/ssl_.py:79: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest /security.html#insecureplatformwarning. 

¿Alguna idea de por qué estoy recibiendo esto? He comprobado los documentos, como se especifica en el mensaje de error, pero los documentos indican que se debe importar urllib3 y desactivar la advertencia o proporcionar un certificado.

Utilice la función de seguridad un tanto oculta:

pip install requests[security] o pip install pyOpenSSL ndg-httpsclient pyasn1

Ambos comandos instalan los siguientes paquetes extra:

  • pyOpenSSL
  • criptografía
  • idna

Tenga en cuenta que esto no es necesario para python-2.7.9 + .

Si la pip install falla con errores, verifique si ha requerido paquetes de desarrollo para libssl , libssl y python instalados en su sistema mediante el administrador de paquetes de la distribución :

  • Debian / Ubuntupython-dev libffi-dev libssl-dev paquetes libssl-dev .

  • Fedoraopenssl-devel python-devel libffi-devel paquetes de libffi-devel .

La lista anterior de Distro está incompleta.

Solución ( vea la respuesta original de @TomDotTom ) :

En caso de que no pueda instalar algunos de los paquetes de desarrollo necesarios, también hay una opción para deshabilitar esa advertencia:

 import requests.packages.urllib3 requests.packages.urllib3.disable_warnings() 

Si su propio pip se ve afectado por InsecurePlatformWarning y no puede instalar nada desde PyPI, se puede solucionar con esta guía paso a paso para implementar paquetes de python adicionales manualmente.

Las solicitudes 2.6 introdujeron esta advertencia para los usuarios de python antes de 2.7.9 con solo los módulos SSL de stock disponibles.

Suponiendo que no pueda actualizar a una versión más nueva de python, esto instalará bibliotecas SSL de Python más actualizadas:

 pip install --upgrade ndg-httpsclient 

SIN EMBARGO, esto puede fallar en algunos sistemas sin las dependencias de comstackción para pyOpenSSL. En los sistemas Debian, ejecutar esto antes del comando pip anterior debería ser suficiente para que PyOpenSSL pueda comstackr:

 apt-get install python-dev libffi-dev libssl-dev 

No uso esto en producción, solo algunos corredores de prueba. Y para reiterar la documentación de urllib3.

Si sabe lo que está haciendo y le gustaría inhabilitar esta y otras advertencias

 import requests.packages.urllib3 requests.packages.urllib3.disable_warnings() 

Editar / Actualizar:

Lo siguiente también debería funcionar:

 import logging import requests # turn down requests log verbosity logging.getLogger('requests').setLevel(logging.CRITICAL) 

Si no puede actualizar su versión de Python a 2.7.9 y desea suprimir las advertencias,

puede bajar su versión de ‘solicitudes’ a 2.5.3:

 sudo pip install requests==2.5.3 

Acerca de la versión: http://fossies.org/diffs/requests/2.5.3_vs_2.6.0/requests/packages/urllib3/util/ssl_.py-diff.html

De hecho, puedes probar esto.

requests.post("https://www.google.com", verify=False)

Puedes leer el código para las solicitudes.

"C:\Python27\Lib\site-packages\requests\sessions.py"

 class Session(SessionRedirectMixin): ...... def request(self, method, url, params=None, data=None, headers=None, cookies=None, files=None, auth=None, timeout=None, allow_redirects=True, proxies=None, hooks=None, stream=None, verify=None, # <======== cert=None): """ ... :param verify: (optional) if True, the SSL cert will be verified. A CA_BUNDLE path can also be provided. ... """ 

Todas las soluciones dadas aquí no han ayudado (estoy limitado a Python 2.6.6). He encontrado la respuesta en un simple interruptor para pasar a pip:

 $ sudo pip install --trusted-host pypi.python.org  

Esto le dice a pip que está bien tomar el módulo de pypi.python.org.

Para mí, el problema es el proxy de mi empresa detrás de su firewall que lo hace parecer un cliente malicioso para algunos servidores. Seguridad hooray


Actualización: vea la respuesta de @Alex para conocer los cambios en los dominios de PyPi, y --trusted-host adicionales de --trusted-host que se pueden agregar. (Copiaría / pegaría aquí, pero su respuesta, así que +1 a él)

Esta respuesta no está relacionada, pero si desea deshacerse de la advertencia y obtener la siguiente advertencia de las solicitudes:

InsecurePlatformWarning /usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/util/ssl_.py:79: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.

Puede deshabilitarlo agregando la siguiente línea a su código de python:

requests.packages.urllib3.disable_warnings()

Tuve que ir a bash (de ZSH) primero. Entonces

 sudo -H pip install 'requests[security]' --upgrade 

arreglado el problema

Esto se me ocurrió en Ubuntu 14.04 (con Python 2.7.6) la semana pasada después de que hice una apt-get dist-upgrade que incluía libssl1.1:amd64 de deb.sury.org .

Dado que ejecuto certbot-auto renew desde un trabajo cron, también uso la --no-self-upgrade para reducir el mantenimiento no progtwigdo. Esto parece haber sido la fuente del problema.

Para corregir el error, todo lo que necesitaba hacer era convertirse en root (con el interruptor de --login ) y dejar que certbot-auto actualice. Es decir:

 sudo su --login /usr/local/bin/certbot-auto renew # ... Upgrading certbot-auto 0.8.1 to 0.18.2... blah blah blah ... 

En lugar de lo que normalmente se ejecuta desde el crontab de la raíz:

 5 7 * * * /usr/local/bin/certbot-auto renew --quiet --no-self-upgrade 

Después de eso, los renombrados de letencrypt corrieron normalmente una vez más.

Para mi no hay trabajo necesito actualizar pip …

Debian / Ubuntu

dependencias de instalación

 sudo apt-get install libpython-dev libssl-dev libffi-dev 

actualizar pip e instalar paquetes

 sudo pip install -U pip sudo pip install -U pyopenssl ndg-httpsclient pyasn1 

Si quieres eliminar dependencias

 sudo apt-get remove --purge libpython-dev libssl-dev libffi-dev sudo apt-get autoremove 

Acabo de tener un problema similar en un servidor CentOS 5 donde instalé python 2.7.12 en / usr / local sobre una versión mucho más antigua de python2.7. La actualización a CentOS 6 o 7 no es una opción en este servidor en este momento.

Algunos de los módulos de Python 2.7 aún existían en la versión anterior de python, pero pip no se pudo actualizar porque el paquete de criptografía más reciente no es compatible con los paquetes de CentOS 5.

Específicamente, las ‘solicitudes de instalación de pip [seguridad]’ fallaron porque la versión openssl en el CentOS 5 era 0.9.8e, que ya no es compatible con criptografía> 1.4.0.

Para resolver el problema original de OPs hice:

 1) pip install 'cryptography<1.3.5,>1.3.0'. 

Esta instalada la criptografía 1.3.4 que funciona con openssl-0.9.8e. cryptograpy 1.3.4 también es suficiente para satisfacer el requisito del siguiente comando.

 2) pip install 'requests[security]' 

Este comando ahora se instala porque no intenta instalar criptografía> 1.4.0.

Tenga en cuenta que en Centos 5 también necesitaba:

 yum install openssl-devel 

Para permitir construir la criptografía

A continuación se muestra cómo funciona para mí en Python 3.6:

 import requests import urllib3 # Suppress InsecureRequestWarning: Unverified HTTPS urllib3.disable_warnings() 

No instale pyOpenSSL ya que pronto estará en desuso. El mejor enfoque actual es

 import requests requests.packages.urllib3.disable_warnings() 

Si solo quieres detener la advertencia insegura como:

/usr/lib/python3/dist-packages/urllib3/connectionpool.py:794: InsecureRequestWarning: se está realizando una solicitud HTTPS no verificada. Se recomienda agregar la verificación del certificado. Consulte: https://urllib3.readthedocs.org/en/latest/security.html InsecureRequestWarning)

hacer:

 requests.METHOD("https://www.google.com", verify=False) 

verificar = falso

Es la clave, los seguidores no son buenos en eso:

requests.packages.urllib3.disable_warnings ()

o

urllib3.disable_warnings ()

pero, TIENE QUE saber, eso podría causar riesgos potenciales de seguridad .