Error de SSL InsecurePlatform al usar el paquete Solicitudes

237

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

He usado Solicitudes muchas veces en el pasado y nunca enfrenté este problema, pero parece que cuando Requestshago solicitudes https obtengo una InsecurePlatformexcepción.

El error menciona urllib3, pero no tengo eso instalado. Lo instalé para verificar si resolvió el error, pero no fue así.

/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? Revisé los documentos, tal como se especifica en el mensaje de error, pero los documentos dicen que importen urllib3 y que deshabiliten la advertencia o proporcionen un certificado.

Luke Peckham
fuente

Respuestas:

390

Use la característica de seguridad algo oculta :

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

Ambos comandos instalan los siguientes paquetes adicionales:

  • pyOpenSSL
  • criptografía
  • idna

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

Si pip installfalla con errores, comprobar si ha requerido paquetes de desarrollo para libffi, libssly pythonse instala en su sistema usando el gestor de paquetes de la distribución :

  • Debian / Ubuntu - python-dev libffi-dev libssl-devpaquetes.

  • Fedora - openssl-devel python-devel libffi-develpaquetes.

La lista de distribución anterior está incompleta.

Solución alternativa ( consulte 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 pippropio sistema se ve afectado InsecurePlatformWarningy no puede instalar nada desde PyPI, puede solucionarlo con esta guía paso a paso para implementar paquetes adicionales de Python manualmente.

Plaes
fuente
3
Tengo solicitudes [seguridad], nueva terminal, Python 2.7.3 y sigo recibiendo este error
Josh Nankin
45
también necesita instalar bibliotecas adicionales en el sistema para Ubuntu / Debian:sudo apt-get install python-dev libffi-dev libssl-dev
therealmarv
2
¿Está bien que "pip" en sí mismo (desde v6.1) da la misma advertencia de seguridad?
jmster
55
dependiendo de su caparazón, es posible que deba escribirpip install 'requests[security]'
C. Reed
55
en zshell, debe decir: solicitudes de instalación de pip \ [seguridad \]
Amir Katz
68

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

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

pip install --upgrade ndg-httpsclient 

SIN EMBARGO, esto puede fallar en algunos sistemas sin las dependencias de compilación para pyOpenSSL. En sistemas debian, ejecutar esto antes del comando pip anterior debería ser suficiente para que pyOpenSSL construya:

apt-get install python-dev libffi-dev libssl-dev
Jessica Gadling
fuente
44
También necesitaba instalar estos paquetes 'python-dev libffi-dev libssl-dev' para ubuntu 14.04.
Andy
¡Gracias! He agregado una nota a la documentación: github.com/shazow/urllib3/pull/765
Wolfgang
@Jessica FTW! Muchas gracias, esto fue molesto.
Neal Magee
18

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 desea desactivar 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)
TomDotTom
fuente
1
El problema con esta solución es que simplemente suprime e ignora el problema real. Además, esto no funcionará cuando use pip para instalar o actualizar paquetes.
Jason Parham
1
La única solución que me funciona en un ubuntu 1404 / Python 2.7.6. Gracias
Ignacio Vázquez
7

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

puede degradar 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

raittes
fuente
8
Tenga en cuenta que 2.5.3 tiene un problema de seguridad con el manejo de cookies durante los redireccionamientos.
Plaes
2
En lugar de publicar esta respuesta dos veces, debería haber marcado la otra publicación como un duplicado. Ahora lo he cerrado como tal.
Martijn Pieters
66
Secundo el comentario para no degradarlo debido a la vulnerabilidad conocida.
sergiopereira
7

De hecho, puedes probar esto.

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

Puede leer el código de 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.
    ...
    """
zzzz zzzz
fuente
2
¡Tenga mucho cuidado al hacer esto, no verificar los certificados puede ser peligroso!
jaapz
Por supuesto, no verificar los certificados será peligroso. Pero a veces, este es un último recurso. Ej: easy_install, apt-get, yum o pip ... no ejecute, o haga un pequeño rastreador web ...
zzzz zzzz
1
Estoy en un entorno de alojamiento compartido, así que no puedo actualizar Python a 2.7.9 y no puedo instalar libffi.pc con apt-get, que es requerido por las solicitudes de instalación de pip [seguridad] y las otras variantes de instalación de pip encima. Entonces esta respuesta fue la que funcionó para mí. Siempre y cuando comprenda la advertencia importante de que sin la verificación https el contenido de la página podría modificarse / falsificarse, creo que esta respuesta está bien.
Chirael
5

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

$ sudo pip install --trusted-host pypi.python.org <module_name>

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 hace que parezca un cliente malicioso para algunos servidores. Hurra de seguridad.


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

PfunnyGuy
fuente
Finalmente pude instalar tensorflow usando este comando, ¡muchas gracias!
pedrobisp
3

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

daemonsl
fuente
Gracias por esto. Ninguna de las otras respuestas funcionó para mí. Estoy asombrado de que un mensaje tan molesto y detallado se ponga por defecto.
Dan
1

bashPrimero tuve que ir a (desde ZSH). Luego

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

Se solucionó el problema.

Martin Thoma
fuente
No estoy seguro. Creo que se debe a los corchetes
Martin Thoma
1

Esto se produjo por mí en Ubuntu 14.04 (con Python 2.7.6) la semana pasada después de que hice una apt-get dist-upgradeque incluía libssl1.1:amd64desde deb.sury.org.

Como ejecuto certbot-auto renewun trabajo cron, también lo uso --no-self-upgradepara reducir el mantenimiento no programado. Esto parece haber sido la fuente del problema.

Para corregir el error, todo lo que necesitaba hacer era convertirme en root (con suel --logininterruptor) y dejar que se certbot-autoactualizara. 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 root:

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

Después de eso, los renwals de letsencrypt se ejecutaron normalmente una vez más.

Dale Anderson
fuente
Tengo el mismo problema descrito aquí. advertencias: /usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/util/ssl_.py:122: InsecurePlatformWarning: un verdadero objeto SSLContext no está disponible. Esto evita que urllib3 configure SSL de manera adecuada y puede causar que algunas conexiones SSL fallen. Puede actualizar a una versión más nueva de Python para resolver esto. Para obtener más información, consulte urllib3.readthedocs.io/en/latest/… . InsecurePlatformWarning Acabo de escribir el comando: sudo apt-get dist-upgrade El error fue corregido.
Didierh
0

Para mí no hay trabajo, necesito pip de actualización ...

Debian / Ubuntu

instalar dependencias

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
Thedemon007
fuente
0

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. Actualizar 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 todavía 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]' fallaban porque la versión de openssl en CentOS 5 era 0.9.8e, que ya no es compatible con criptografía> 1.4.0.

Para resolver el problema original de los OP que hice:

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

Esta criptografía instalada 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 que se desarrolle la criptografía

DavidG
fuente
0

A continuación se muestra cómo me funciona en Python 3.6:

import requests
import urllib3

# Suppress InsecureRequestWarning: Unverified HTTPS
urllib3.disable_warnings()
Luiz Vaz
fuente
0

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

import requests
requests.packages.urllib3.disable_warnings()
Mohammad Shahid Siddiqui
fuente
0

si solo quiere 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. Ver: https://urllib3.readthedocs.org/en/latest/security.html InsecureRequestWarning)

hacer:

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

verificar = falso

es la clave, los siguientes no son buenos en eso:

request.packages.urllib3.disable_warnings ()

o

urllib3.disable_warnings ()

pero TIENE QUE SABER que eso puede causar riesgos potenciales de seguridad .

JZ
fuente
0

Tuve el mismo problema con
Mac
Pycharm community edition 2019.3
Python interpreter 3.6.
Actualizar pip con 20.0.2 funcionó para mí.
Pycharm --> Preferences --> Project Interpreter --> click on pip --> specify version 20.0.2 --> Install package

GPopat
fuente