example python windows ssl pip

python - example - ¿Cómo agregar un certificado raíz de CA personalizado a la tienda de CA utilizada por pip en Windows?



python ssl (5)

Autoridades de certificación conda pip / conda

Después de documentar extensamente 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 CA actualizado

cURL publica un extracto de las autoridades de certificación incluidas en Mozilla Firefox

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

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 pueden codificarse 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 codificación 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

Obtener nuestro certificado autofirmado

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

  • Vía OpenSSL CLI
  • A través del navegador
  • Vía Python Scripting

Obtenga nuestro certificado autofirmado de 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) sobre cómo ver el certificado y luego copiarlo al archivo usando la opción de codificación PEM base64.

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

Por 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 brillantes en:

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

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

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

Finalmente

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

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

Acabo de instalar Python3 desde python.org y tengo problemas para instalar paquetes con pip . Por diseño, aquí hay un dispositivo de inspección de paquetes man-in-the-middle 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.

Cuando uso Java, si necesito acceder a sitios externos https, necesito actualizar manualmente los cacerts en la JVM para confiar en el certificado de CA autofirmado.

¿Cómo logro eso para Python? En este momento, cuando intento instalar paquetes usando pip , comprensiblemente, obtengo errores maravillosos [SSL: CERTIFICATE_VERIFY_FAILED] .

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

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


Abra el Navegador Anaconda.

Vaya a Archivo / Preferencias.

Habilitar verificación SSL Deshabilitar (no recomendado)

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

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

Seleccione Instalar en la esquina superior derecha

Seleccione paquete haga clic en la marca

Marcar para actualizar

Marcar para instalación de versión específica

Haga clic en Aplicar


Ejecute: python -c "import ssl; print(ssl.get_default_verify_paths())" para verificar las rutas actuales que se utilizan para verificar el certificado. Agregue el certificado raíz de su empresa 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.


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.


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"