sslerror sessions requests failed exceptions close certificate_verify_failed auth async python ssl python-requests urllib3

failed - requests python sessions



Solicitudes de Python lanzando SSLError (19)

Actualmente hay un problema en el módulo de solicitudes que causa este error, presente en v2.6.2 a v2.12.4 (ATOW): https://github.com/kennethreitz/requests/issues/2573

La solución para este problema es agregar la siguiente línea: requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = ''ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS''

Estoy trabajando en un script simple que involucra CAS, control de seguridad jspring, redirección, etc. ¡Me gustaría usar las solicitudes de pitón de Kenneth Reitz porque es un gran trabajo! Sin embargo, CAS requiere ser validado a través de SSL, así que primero debo pasar ese paso. No sé lo que está pidiendo Python peticiones? ¿Dónde se supone que reside este certificado SSL?

Traceback (most recent call last): File "./test.py", line 24, in <module> response = requests.get(url1, headers=headers) File "build/bdist.linux-x86_64/egg/requests/api.py", line 52, in get File "build/bdist.linux-x86_64/egg/requests/api.py", line 40, in request File "build/bdist.linux-x86_64/egg/requests/sessions.py", line 209, in request File "build/bdist.linux-x86_64/egg/requests/models.py", line 624, in send File "build/bdist.linux-x86_64/egg/requests/models.py", line 300, in _build_response File "build/bdist.linux-x86_64/egg/requests/models.py", line 611, in send requests.exceptions.SSLError: [Errno 1] _ssl.c:503: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed


Como lo mencionó @Rafael Almeida, el problema que tiene es causado por un certificado SSL no confiable. En mi caso, el servidor no confió en el certificado SSL. Para solucionar esto sin comprometer la seguridad, descargué el certificado y lo instalé en el servidor (simplemente haciendo doble clic en el archivo .crt y luego Instalar certificado ...).


De solicitudes de documentación sobre verificación SSL :

Las solicitudes pueden verificar los certificados SSL para las solicitudes HTTPS, al igual que un navegador web. Para verificar el certificado SSL de un host, puede usar el argumento de verificación:

>>> requests.get(''https://kennethreitz.com'', verify=True)

Si no desea verificar su certificado SSL, haga que verify=False


Después de horas de depuración, solo conseguí que esto funcionara con los siguientes paquetes:

requests[security]==2.7.0 # not 2.18.1 cryptography==1.9 # not 2.0

utilizando OpenSSL 1.0.2g 1 Mar 2016

Sin estos paquetes, verify=False no funcionaba.

Espero que esto ayude a alguien.


El nombre del archivo CA a utilizar que podría pasar a través de verify :

cafile = ''cacert.pem'' # http://curl.haxx.se/ca/cacert.pem r = requests.get(url, verify=cafile)

Si usa verify=True entonces las requests utilizan su propio conjunto de CA que podría no tener CA que firmó su certificado de servidor.


El problema que tiene es causado por un certificado SSL no confiable.

Al igual que @dirk mencionado en un comentario anterior, la solución más rápida es la configuración de verify=False :

requests.get(''https://example.com'', verify=False)

Tenga en cuenta que esto hará que el certificado no sea verificado. Esto expondrá su aplicación a riesgos de seguridad, como los ataques de intermediarios.

Por supuesto, aplicar el juicio. Como se mencionó en los comentarios, esto puede ser aceptable para aplicaciones / scripts rápidos / desechables, pero en realidad no debería ir al software de producción .

Si simplemente omitir la verificación del certificado no es aceptable en su contexto particular, considere las siguientes opciones, su mejor opción es establecer el parámetro de verify en una cadena que sea la ruta del archivo .pem del certificado (que debe obtener de alguna manera). tipo de medios seguros).

Entonces, a partir de la versión 2.0, el parámetro verify acepta los siguientes valores, con sus respectivas semánticas:

  • True : hace que el certificado se valide frente a las propias autoridades de certificación de confianza de la biblioteca (Nota: puede ver qué solicitudes de certificados raíz utiliza a través de la biblioteca Certifi, una base de datos de RC extraída de Solicitudes: Certifi - Trust Database for Humans ).
  • False : pasa por alto la validación de certificados completamente .
  • Ruta a un archivo CA_BUNDLE para que las solicitudes se utilicen para validar los certificados.

Fuente: Solicitudes - SSL Cert Verification

También eche un vistazo al parámetro cert en el mismo enlace.


En caso de que tenga una biblioteca que dependa de las requests y no pueda modificar la ruta de verificación (como con pyvmomi ), tendrá que encontrar el cacert.pem incluido en las solicitudes y adjuntar su CA allí. Aquí hay un enfoque genérico para encontrar la ubicación cacert.pem :

ventanas

C:/>python -c "import requests; print requests.certs.where()" c:/Python27/lib/site-packages/requests-2.8.1-py2.7.egg/requests/cacert.pem

linux

# (py2.7.5,requests 2.7.0, verify not enforced) root@host:~/# python -c "import requests; print requests.certs.where()" /usr/lib/python2.7/dist-packages/certifi/cacert.pem # (py2.7.10, verify enforced) root@host:~/# python -c "import requests; print requests.certs.where()" /usr/local/lib/python2.7/dist-packages/requests/cacert.pem

por cierto @ request-devs, agrupar sus propios cacerts con request es realmente, realmente molesto ... especialmente el hecho de que no parece utilizar el sistema ca store primero y esto no está documentado en ninguna parte.

actualizar

en situaciones en las que está utilizando una biblioteca y no tiene control sobre la ubicación del paquete ca, también puede establecer explícitamente la ubicación del paquete ca para que sea el paquete ca de todo el host:

REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-bundle.crt python -c "import requests; requests.get(''https://somesite.com'';)"


Encontré el mismo problema y el certificado ssl falló al fallar el problema al usar aws boto3, al revisar el código de boto3, encontré que el REQUESTS_CA_BUNDLE no está establecido, así que solucioné el problema al configurarlo manualmente:

from boto3.session import Session import os # debian os.environ[''REQUESTS_CA_BUNDLE''] = os.path.join( ''/etc/ssl/certs/'', ''ca-certificates.crt'') # centos # ''ca-bundle.crt'')

Para aws-cli, supongo que si configura REQUESTS_CA_BUNDLE en ~/.bashrc se solucionará este problema (no se ha probado porque mi aws-cli funciona sin él).

REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # ca-bundle.crt export REQUESTS_CA_BUNDLE


Estaba teniendo un problema de validación de certificación similar o similar. Leí que las versiones de OpenSSL inferiores a 1.0.2, de las que depende la solicitud, a veces tienen problemas para validar certificados sólidos (consulte here ). CentOS 7 parece usar 1.0.1e que parece tener el problema.

No estaba seguro de cómo solucionar este problema en CentOS, así que decidí permitir certificados CA de 1024 bits más débiles.

import certifi # This should be already installed as a dependency of ''requests'' requests.get("https://example.com", verify=certifi.old_where())


He encontrado un enfoque específico para resolver un problema similar. La idea es apuntar el archivo cacert almacenado en el system y utilizado por otras aplicaciones basadas en ssl.

En Debian (no estoy seguro si es igual en otras distribuciones) los archivos de certificado (.pem) se almacenan en /etc/ssl/certs/ Entonces, este es el código que me funciona:

import requests verify=''/etc/ssl/certs/cacert.org.pem'' response = requests.get(''https://lists.cacert.org'', verify=verify)

Para adivinar qué archivo pem elegir, tengo que buscar en la url y comprobar qué Autoridad de certificación (CA) ha generado el certificado.

EDITAR: si no puede editar el código (porque está ejecutando una tercera aplicación) puede intentar agregar el certificado pem directamente en /usr/local/lib/python2.7/dist-packages/requests/cacert.pem (por ejemplo, copiar hasta el final del archivo).


Luché contra este problema por HORAS.

Traté de actualizar las solicitudes. Luego actualicé certifi. Señalé verificar a certifi.where () (el código hace esto de manera predeterminada de todos modos). Nada funcionó.

Finalmente, actualicé mi versión de python a python 2.7.11. Estaba en Python 2.7.5, que tenía algunas incompatibilidades con la forma en que se verifican los certificados. Una vez que actualicé Python (y un puñado de otras dependencias) comenzó a funcionar.


Me encontré con el mismo problema. Resulta que no había instalado el certificado intermedio en mi servidor (solo adjúntelo al final de su certificado como se ve a continuación).

https://www.digicert.com/ssl-support/pem-ssl-creation.htm

Asegúrese de tener instalado el paquete de certificados de ca:

sudo apt-get install ca-certificates

Actualizar el tiempo también puede resolver esto:

sudo apt-get install ntpdate sudo ntpdate -u ntp.ubuntu.com

Si está utilizando un certificado autofirmado, probablemente tendrá que agregarlo a su sistema manualmente.


Me enfrento al mismo problema con gspread y estos comandos funcionan para mí:

sudo pip uninstall -y certifi sudo pip install certifi==2015.04.28


No es posible agregar opciones si se están llamando solicitudes desde otro paquete. En ese caso, agregar certificados al paquete cacert es la ruta directa, por ejemplo, tuve que agregar "CA de Servidor Intermedio Primario StartCom Clase 1", para lo cual descargué el certificado raíz en StartComClass1.pem. dado que mi virtualenv se llama caldav, agregué el certificado con:

cat StartComClass1.pem >> .virtualenvs/caldav/lib/python2.7/site-packages/pip/_vendor/requests/cacert.pem cat temp/StartComClass1.pem >> .virtualenvs/caldav/lib/python2.7/site-packages/requests/cacert.pem

Uno de esos podría ser suficiente, no lo comprobé.


Si desea eliminar las advertencias, utilice el siguiente código.

import urllib3 urllib3.disable_warnings()

y verify=False con request.get o método post


Si las llamadas de solicitud están enterradas en algún lugar del código y no desea instalar el certificado del servidor, entonces, solo con fines de depuración , es posible realizar solicitudes mono parche:

import requests.api import warnings def requestspatch(method, url, **kwargs): kwargs[''verify''] = False return _origcall(method, url, **kwargs) _origcall = requests.api.request requests.api.request = requestspatch warnings.warn(''Patched requests: SSL verification disabled!'')

¡Nunca usar en producción!


Si no se preocupa por el certificado, simplemente use verify=False .

import requests url = "Write your url here" returnResponse = requests.get(url, verify=False)


Tuve que actualizar de Python 3.4.0 a 3.4.6

pyenv virtualenv 3.4.6 myvenv pyenv activate myvenv pip install -r requirements.txt


$ pip install -U requests[security]

  • Probado en Python 2.7.6 @ Ubuntu 14.04.4 LTS
  • Probado en Python 2.7.5 @ MacOSX 10.9.5 (Mavericks)

Cuando se abrió esta pregunta (2012-05), la versión de Solicitudes era 0.13.1. En la versión 2.4.1 (2014-09) se introdujeron los extras de "seguridad", utilizando el paquete certifi si está disponible.

En este momento (2016-09) la versión principal es 2.11.1, que funciona bien sin verify=False . No es necesario utilizar requests.get(url, verify=False) , si está instalado con requests[security] extras de requests[security] .