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