¿Cómo agregar un certificado CA Root personalizado a la tienda de CA utilizada por pip en Windows?

Acabo de instalar Python3 de python.org y tengo problemas para instalar los paquetes con pip . Por diseño, aquí hay un dispositivo de inspección de paquetes de intermediario en la red que inspecciona todos los paquetes (incluido ssl) al renunciar a todas las conexiones ssl con su propio certificado. Parte del GPO inserta el certificado raíz personalizado en el almacén de claves de Windows.

Al usar Java, si necesito acceder a sitios https externos, debo actualizar manualmente los cacerts en la JVM para confiar en el certificado CA autofirmado.

¿Cómo logro eso para python? En este momento, cuando trato de instalar paquetes usando pip , comprensiblemente, recibo maravillosos errores [SSL: CERTIFICATE_VERIFY_FAILED] .

Me doy cuenta de que puedo ignorarlos usando el parámetro --trusted-host , pero no quiero hacer eso con cada paquete que bash instalar.

¿Hay alguna manera de actualizar el almacén de certificados de CA que Python utiliza?

Autoridades de certificación conda pip / conda

Después de documentar ampliamente un problema similar con Git ( ¿Cómo puedo hacer que git acepte un certificado autofirmado? ), Aquí estamos nuevamente detrás de un firewall corporativo con un proxy que nos da un “ataque” MitM en el que debemos confiar y:

¡NUNCA deshabilite toda la verificación SSL!

Esto crea una mala cultura de seguridad. No seas esa persona.

tl; dr

 pip config set global.cert path/to/ca-bundle.crt pip config list conda config --set ssl_verify path/to/ca-bundle.crt conda config --show ssl_verify # Bonus while we are here... git config --global http.sslVerify true git config --global http.sslCAInfo path/to/ca-bundle.crt 

Pero, ¿dónde obtenemos ca-bundle.crt ?


Obtenga un paquete de CA actualizado

cURL publica un extracto de las Autoridades de Certificación incluidas con Mozilla Firefox

https://curl.haxx.se/docs/caextract.html

  • Descarga directa
  • SHA256

Le recomiendo que abra este archivo cacert.pem en un editor de texto ya que necesitaremos agregar nuestra CA cacert.pem a este archivo.

Los certificados son un documento que cumple con X.509 pero se pueden codificar en el disco de varias maneras. El siguiente artículo es una buena lectura, pero la versión corta es que estamos tratando con la encoding base64 que a menudo se llama PEM en las extensiones de archivo. Verás que tiene el formato:

 ----BEGIN CERTIFICATE---- .... base64 encoded binary data .... ----END CERTIFICATE---- 

https://support.ssl.com/Knowledgebase/Article/View/19/0/der-vs-crt-vs-cer-vs-pem-certificates-and-how-to-convert-them


Obteniendo nuestro certificado autofirmado

A continuación hay algunas opciones sobre cómo obtener nuestro certificado autofirmado:

  • A través de OpenSSL CLI
  • A través del navegador
  • A través de secuencias de comandos Python

Obtenga nuestro certificado autofirmado por OpenSSL CLI

https://unix.stackexchange.com/questions/451207/how-to-trust-self-signed-certificate-in-curl-command-line/468360#468360

 echo quit | openssl s_client -showcerts -servername "curl.haxx.se" -connect curl.haxx.se:443 > cacert.pem 

Obtenga nuestra autoridad de certificación autofirmada a través del navegador

Gracias a esta respuesta y al blog vinculado, muestra los pasos (en Windows) para ver el certificado y luego copiarlo en un archivo utilizando la opción de encoding PEM de base64.

Copie el contenido de este archivo exportado y péguelo al final de su archivo cacerts.pem .

Para mayor coherencia, cambie el nombre de este archivo cacerts.pem -> ca-bundle.crt y colóquelo en un lugar fácil como:

 # Windows %USERPROFILE%\certs\ca-bundle.crt # or *nix $HOME/certs/cabundle.crt 

Obtenga nuestra Autoridad de Certificación Autofirmada a través de Python

Gracias a todas las respuestas shinys en:

¿Cómo obtener el certificado SSL de respuesta de las solicitudes en Python?

He reunido lo siguiente para intentar ir un paso más allá.

https://github.com/neozenith/get-ca-py


Finalmente

Establezca la configuración en pip y conda para que sepa dónde reside esta tienda de CA con nuestra CA adicional autofirmada.

 pip config set global.cert %USERPROFILE%\certs\ca-bundle.crt conda config --set ssl_verify %USERPROFILE%\certs\ca-bundle.crt 

O

 pip config set global.cert $HOME/certs/ca-bundle.crt conda config --set ssl_verify $HOME/certs/ca-bundle.crt 

ENTONCES

 pip config list conda config --show ssl_verify 

Referencias

Ejecute: python -c "import ssl; print(ssl.get_default_verify_paths())" para verificar las rutas actuales que se usan para verificar el certificado. Agregue el certificado raíz de su compañía a uno de esos.

La ruta openssl_capath_env apunta a la variable de entorno: SSL_CERT_DIR .

Si SSL_CERT_DIR no existe, deberá crearlo y SSL_CERT_DIR a una carpeta válida dentro de su sistema de archivos. Luego puede agregar su certificado a esta carpeta para usarlo.

No es la mejor respuesta, pero puede reutilizar un paquete ca ya creado usando la opción --cert de pip , por ejemplo:

 pip install SQLAlchemy==1.1.15 --cert="C:\Users\myUser\certificates\my_ca-bundle.crt" 

En Windows, lo resolví creando un archivo pip.ini en% APPDATA% \ pip \

por ejemplo, C: \ Users \ asmith \ AppData \ Roaming \ pip \ pip.ini

En el pip.ini pongo la ruta a mi certificado:

 [global] cert=C:\Users\asmith\SSL\teco-ca.crt 

https://pip.pypa.io/en/stable/user_guide/#configuration tiene más información sobre el archivo de configuración.

Abre el navegador de anaconda.

Ir a Archivo \ Preferencias.

Habilitar verificación SSL Deshabilitar (no recomendado)

o Habilitar e indicar la ruta del certificado SSL (Opcional)

Actualizar un paquete a una versión específica:

Seleccione Instalar en la parte superior derecha

Seleccione el paquete haga clic en la marca

Marcar para actualizar

Marca para la instalación de la versión específica

Haga clic en Aplicar