Saltar al contenido

Solicitudes de Python: ¿cómo usar los certificados CA del sistema (debian/ubuntu)?

Hola, hallamos la solución a lo que buscas, desplázate y la verás a continuación.

Solución:

Desde https://stackoverflow.com/a/33717517/1695680

Para hacer que las solicitudes de python usen el paquete de certificados CA del sistema, se le debe indicar que lo use sobre su propio paquete incrustado

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

Las solicitudes incorporan sus paquetes aquí, como referencia:

/usr/local/lib/python2.7/site-packages/requests/cacert.pem
/usr/lib/python3/dist-packages/requests/cacert.pem

O en versiones más nuevas, use un paquete adicional para obtener certificados de: https://github.com/certifi/python-certifi

Para verificar desde qué archivo se cargan los certificados, puede probar:

Python 3.8.5 (default, Jul 28 2020, 12:59:40) 
>>> import certifi
>>> certifi.where()
'/etc/ssl/certs/ca-certificates.crt'

Luché con esto durante una semana más o menos recientemente. Finalmente encontré la forma de verificar un certificado autofirmado o firmado de forma privada en Python. Debe crear su propio archivo de paquete de certificados. No es necesario actualizar paquetes de certificados oscuros cada vez que actualiza una biblioteca, ni agregar nada al almacén de certificados del sistema.

Comience ejecutando el comando openssl que ejecutó antes, pero agregue -showcerts. openssl s_client -connect mysite.local:443 -showcerts Esto le dará una salida larga y en la parte superior verá la cadena de certificados completa. Por lo general, esto significa tres certificados, el certificado del sitio web, el certificado intermedio y el certificado raíz en ese orden. Necesitamos colocar solo los certificados raíz e intermedios en un archivo siguiente en el orden opuesto.

Copie el último certificado, el certificado raíz, en un nuevo archivo de texto. Tome solo las cosas entre, e incluyendo:

-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

Copie el certificado intermedio (también conocido como el certificado intermedio) en el nuevo archivo de texto bajo el certificado raíz. Nuevamente, tome las líneas Begin y End Certificate y todo lo demás.

Guarde este archivo de texto en el directorio donde reside su secuencia de comandos de Python. Mi recomendación es llamarlo CertBundle.pem. (Si le asigna un nombre diferente o lo coloca en otro lugar de la estructura de carpetas, asegúrese de que la línea de verificación lo refleje). Actualice su secuencia de comandos para hacer referencia al nuevo paquete de certificados:

response = requests.post("https://www.example.com/", headers=headerContents, json=bodyContents, verify="CertBundle.pem")

Y eso es. Si solo tiene el certificado raíz o solo el intermedio, Python no puede validar toda la cadena de certificados. Pero, si incluye ambos certificados en el paquete de certificados que creó, entonces Python puede validar que el intermedio fue firmado por la raíz, y luego, cuando accede al sitio web, puede validar que el certificado del sitio web fue firmado por el certificado intermedio. .

editar: se corrigió la extensión de archivo para el paquete de certificados. Además, corrigió un par de errores gramaticales.

Mis dos centavos:

Gracias a esta otra respuesta, que me hizo verificar el código de las solicitudes reales, descubrí que no tiene que usar la variable env, pero puede configurar el parámetro “verificar” en su solicitud:

requests.get("https://whatever", verify="/my/path/to/cacert.crt", ...)

También está documentado, aunque solo pude encontrar la documentación después de haber hecho el descubrimiento (y el proyecto pypi apunta a un enlace muerto para doc) 😀

Puedes añadir valor a nuestra información colaborando tu experiencia en las crónicas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *