Estoy trabajando en un script simple que involucra CAS, verificación de seguridad de jspring, redirección, etc. ¡Me gustaría usar las solicitudes de Python de Kenneth Reitz porque es un gran trabajo! Sin embargo, CAS requiere ser validado a través de SSL, así que primero tengo que pasar ese paso. No sé lo que quiere Python. ¿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
python
ssl
python-requests
urllib3
TedBurrows
fuente
fuente
Respuestas:
El problema que tiene es causado por un certificado SSL no confiable.
Como @dirk mencionó en un comentario anterior, la solución más rápida es la configuración
verify=False
:Tenga en cuenta que esto hará que el certificado no se verifique. Esto expondrá su aplicación a riesgos de seguridad, como ataques de hombre en el medio.
Por supuesto, aplique el juicio. Como se menciona en los comentarios, esto puede ser aceptable para aplicaciones / scripts rápidos / descartables, pero realmente 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
verify
parámetro en una cadena que sea la ruta del.pem
archivo del certificado (que debe obtener mediante algún tipo de seguridad medio).Entonces, a partir de la versión 2.0, el
verify
parámetro acepta los siguientes valores, con su semántica respectiva:True
: hace que el certificado se valide contra las autoridades de certificación de confianza de la propia biblioteca (Nota: puede ver qué Solicitudes de certificados raíz utiliza a través de la biblioteca Certifi, una base de datos de confianza de RC extraídos de Solicitudes: Certifi - Base de datos de confianza para humanos ).False
: evita la validación del certificado por completo .Fuente: Solicitudes - Verificación del certificado SSL
También eche un vistazo al
cert
parámetro en el mismo enlace.fuente
verify=False
deshabilita la comprobación del certificado SSL del host.De la documentación de solicitudes de verificación SSL :
Si no desea verificar su certificado SSL, haga
verify=False
fuente
El nombre del archivo de CA para usar puede pasar por
verify
:Si lo usa,
verify=True
entoncesrequests
usa su propio conjunto de CA que podría no tener CA que firmó su certificado de servidor.fuente
requests
Se puede empaquetar para su distribución. Correpython -mrequests.certs
para averiguar a dónde apunta.cacert.pem
de curl. Contiene muchos certificados revocados. Echa un vistazo a Certifi (que Solicitudes usa): certifi.iocacert.pem
son los certificados de CA extraídos de Mozilla (por cURL) - es solo un ejemplo (si la lista de CA utilizada por una web popular -Browser no se puede usar como ejemplo, entonces no sé qué puede ser): el punto de la respuesta es que puede pasar su propio archivo CA si falla la lista predeterminada.$ pip install -U requests[security]
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
certifi
paquete si está disponible.En este momento (2016-09) la versión principal es 2.11.1, que funciona bien sin ella
verify=False
. No es necesario usarrequests.get(url, verify=False)
, si está instalado conrequests[security]
extras.fuente
pip install -U requests[security] --no-cache
dos veces ypip install certifi==2015.04.28
pip install --upgrade pip
antes de instalar el paquete de seguridad de solicitudes para evitar otros erroresEncontré el mismo problema y el certificado SSL verificó un problema fallido al usar aws boto3, al revisar el código boto3, descubrí
REQUESTS_CA_BUNDLE
que no está configurado, así que solucioné ambos problemas configurándolo manualmente:Para aws-cli, supongo que configurar REQUESTS_CA_BUNDLE
~/.bashrc
solucionará este problema (no probado porque mi aws-cli funciona sin él).fuente
En caso de que tenga una biblioteca que se base
requests
y no pueda modificar la ruta de verificación (como conpyvmomi
), entonces tendrá que encontrar lascacert.pem
solicitudes agrupadas y agregar su CA allí. Aquí hay un enfoque genérico para encontrar lacacert.pem
ubicación:ventanas
linux
por cierto. @ request-devs, agrupar tus propias cacerts con request es realmente muy molesto ... especialmente el hecho de que no pareces usar el sistema ca store primero y esto no está documentado en ningún lado.
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:
fuente
verify
ruta.Tengo el mismo problema al usar gspread y estos comandos me funcionan:
fuente
Si desea eliminar las advertencias, use el código a continuación.
y
verify=False
conrequest.get
opost
métodofuente
He encontrado un enfoque específico para resolver un problema similar. La idea es señalar el archivo cacert almacenado en el sistema 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/
So, este es el código que funciona para mí:Para adivinar qué
pem
archivo elegir, tengo que buscar la url y verificar 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
pem
certificado directamente/usr/local/lib/python2.7/dist-packages/requests/cacert.pem
(por ejemplo, copiarlo al final del archivo).fuente
/usr/local/lib/python2.7/dist-packages/requests/cacert.pem
con un enlace simbólico a la tienda del sistema operativo?Si no te molesta el certificado, solo úsalo
verify=False
.fuente
Después de horas de depuración, solo pude hacer que esto funcione con los siguientes paquetes:
utilizando
OpenSSL 1.0.2g 1 Mar 2016
Sin estos paquetes
verify=False
no funcionaba.Espero que esto ayude a alguien.
fuente
Me encontré con el mismo problema. Resulta que no había instalado el certificado intermedio en mi servidor (solo añádalo 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:
Actualizar el tiempo también puede resolver esto:
Si está utilizando un certificado autofirmado, probablemente tendrá que agregarlo a su sistema manualmente.
fuente
Si las llamadas de solicitud están enterradas en algún lugar profundo del código y no desea instalar el certificado del servidor, entonces, solo con fines de depuración , es posible realizar solicitudes de monkeypatch:
¡Nunca lo use en producción!
fuente
Supongo que fue demasiado tarde para la fiesta, ¡pero quería pegar la solución para otros vagabundos como yo! Así que lo siguiente funcionó para mí en Python 3.7.x
Escriba lo siguiente en su terminal
Intente ejecutar su script / solicitudes nuevamente y vea si funciona (¡estoy seguro de que aún no se solucionará!). Si no funcionó, intente ejecutar el siguiente comando en la terminal directamente
fuente
Luché contra este problema por HORAS.
Traté de actualizar las solicitudes. Luego actualicé certifi. Apunté 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.
fuente
Esto es similar a la respuesta de @ rafael-almeida, pero quiero señalar que a partir de las solicitudes 2.11+, no hay 3 valores que
verify
puedan tomar, en realidad hay 4:True
: valida contra las CA de confianza internas de las solicitudes.False
: evita la validación del certificado por completo . (No recomendado)El resto de mi respuesta es sobre el n. ° 4, cómo usar un directorio que contiene certificados para validar:
Obtenga los certificados públicos necesarios y colóquelos en un directorio.
Estrictamente hablando, probablemente "debería" usar un método fuera de banda para obtener los certificados, pero también puede descargarlos usando cualquier navegador.
Si el servidor usa una cadena de certificados, asegúrese de obtener todos los certificados de la cadena.
De acuerdo con la documentación de las solicitudes, el directorio que contiene los certificados debe procesarse primero con la utilidad "rehash" (
openssl rehash
).(Esto requiere openssl 1.1.1+, y no todas las implementaciones de Windows openssl admiten rehash. Si
openssl rehash
no funciona para usted, puede intentar ejecutar el script rehash ruby en https://github.com/ruby/openssl/blob/master /sample/c_rehash.rb , aunque no lo he intentado).Tuve algunos problemas para obtener solicitudes para reconocer mis certificados, pero después de usar el
openssl x509 -outform PEM
comando para convertir los certificados al.pem
formato Base64 , todo funcionó a la perfección.También puedes simplemente hacer una repetición perezosa:
fuente
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'
fuente
Como mencionó @Rafael Almeida, el problema que tiene es causado por un certificado SSL no confiable. En mi caso, el servidor no confiaba 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 ...).
fuente
No es factible agregar opciones si se solicitan solicitudes desde otro paquete. En ese caso, agregar certificados al paquete cacert es la ruta directa, por ejemplo, tuve que agregar "StartCom Class 1 Primary Intermediate Server CA", para lo cual descargué el certificado raíz en StartComClass1.pem. dado que mi virtualenv se llama caldav, agregué el certificado con:
uno de esos podría ser suficiente, no verifiqué
fuente
Estaba teniendo un problema de validación de certificación similar o similar. Leí que las versiones de OpenSSL inferiores a la 1.0.2, de las cuales depende la solicitud, a veces tienen problemas para validar certificados sólidos (ver aquí ). 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.
fuente
Tuve que actualizar de Python 3.4.0 a 3.4.6
fuente
En mi caso, la razón fue bastante trivial.
Sabía que la verificación SSL había funcionado hasta unos días antes, y de hecho estaba trabajando en una máquina diferente.
El siguiente paso fue comparar el contenido y el tamaño del certificado entre la máquina en la que funcionaba la verificación y la que no.
Esto rápidamente me llevó a determinar que el Certificado en la máquina que funcionaba "incorrectamente" no era bueno, y una vez que lo reemplacé con el certificado "bueno", todo estuvo bien.
fuente