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----
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
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
- Adquisición de su CA: https://stackoverflow.com/a/50486128/622276
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
- Pip SSL: https://pip.pypa.io/en/stable/user_guide/#configuration
- Conda SSL: https://stackoverflow.com/a/35804869/622276
- Adquisición de su CA: https://stackoverflow.com/a/50486128/622276
- Uso de Python para tomar automáticamente su CA par: ¿Cómo obtener el certificado SSL de respuesta de las solicitudes en python?
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"