requests library failed python ssl python-requests

python - library - requests django



Error de SSL InsecurePlatform al usar el paquete Solicitudes (14)

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

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

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 hago solicitudes https con Requests obtengo una excepción InsecurePlatform .

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.


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 desde 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


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. ... """


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


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

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

Para corregir el error, todo lo que tenía que hacer era convertirme en root (con el interruptor de --login ) y dejar que certbot-auto actualizara. 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.


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 pueda 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


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

import requests requests.packages.urllib3.disable_warnings()


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)


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



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 answer @Alex para ver los cambios en los dominios de --trusted-host opciones adicionales --trusted-host que se pueden agregar. (Copiaría / pegaría aquí, pero su respuesta, así que +1 a él)


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

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

Se solucionó el problema.


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 la pip install falla con errores, verifique si ha requerido paquetes de desarrollo para libssl , libssl y python instalados en su sistema usando el administrador de paquetes de distribución :

  • Debian / Ubuntu : paquetes python-dev libffi-dev libssl-dev .

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

La lista de distribución anterior está incompleta.

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


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 seguidores 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 .