¿Cómo hacer que Python use certificados de CA de Mac OS TrustStore?

Necesito usar certificados raíz de Curtom en la intranet de la empresa y cargarlos en Mac OS TrustStore (KeyChain) resuelve el problema para todos los navegadores y aplicaciones GUI.

Parece que funciona incluso con la versión de curl que se envía con Mac OS X, pero no funciona con python , incluso la versión que se envía con Mac OS 10.12 Sierra (Python 2.7.10)

Aún así, parece que sería golpeado por:

 urllib2.URLError:  

¿Como puedo resolver esto?

Debido a que encuentro este problema en muchas y muchas herramientas de Python, realmente apreciaría si encontrara una manera de evitarlo sin tener que parchearlas.

El proporcionar el certificado de CA personalizado no es una opción porque no puedo parchar decenas de herramientas de Python que uso.

La mayoría de las herramientas están usando la biblioteca de requests , pero hay algunas que usan el soporte nativo de SSL en Python directamente.

Esto también es un problema en Python 3.6 con MacOS Sierrra. Sé que su caso de uso es diferente. Pero me topé con este hilo al investigar este problema. Así que si alguien también tiene este artículo, vale la pena echarle un vistazo:

http://www.cdotson.com/2017/01/sslerror-with-python-3-6-x-on-macos-sierra/

En pocas palabras : Python 3.6 ya no se basa en openSSL de MacOS. Viene con su propio paquete openSSL y no tiene acceso a los certificados raíz de MacOS.

Tienes dos opciones:

Ejecuta un comando de instalación incluido con Python 3.6

 cd /Applications/Python\ 3.6/ ./Install\ Certificates.command 

o

Instale el paquete certifi con

 pip install certifi 

Escogí la primera opción y funcionó.

Si coloca los certificados adicionales en un archivo de paquete PEM, puede usar estas dos variables de entorno para sobrescribir los almacenes de certificados predeterminados utilizados por Python openssl y solicitudes.

 SSL_CERT_FILE=/System/Library/OpenSSL/cert.pem REQUESTS_CA_BUNDLE=/System/Library/OpenSSL/cert.pem 

Tenga en cuenta que este archivo no existe, debe crearlo usted mismo.

Como actualización y punto de datos, me encontré con este problema al ejecutar Python 3.7.0 en macOS 10.13.4:

 $ ipython Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 26 2018, 23:26:24) Type 'copyright', 'credits' or 'license' for more information IPython 7.0.1 -- An enhanced Interactive Python. Type '?' for help. In [1]: import bokeh.sampledata In [2]: bokeh.sampledata.download() Using data directory: /Users/me/.bokeh/data ... SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1045) 

Las instrucciones para resolver el problema se encuentran en /Applications/Python\ 3.7/ReadMe.rtf

Siguiendo la sugerencia y ejecutando /Applications/Python\ 3.7/Install\ Certificates.command solucionó el problema:

Desde la terminal:

 $ /Applications/Python\ 3.7/Install\ Certificates.command 

Reiniciando IPython …

 $ ipython >>> import bokeh.sampledata >>> bokeh.sampledata.download() Using data directory: /Users/me/.bokeh/data Downloading: CGM.csv (1589982 bytes) 1589982 [100.00%] ... 

Para mí /Applications/Python\ 3.6/./Install\ Certificates comando /Applications/Python\ 3.6/./Install\ Certificates falla en la instalación de certifi de pip. Estoy en mac High Sierra y uso python3, así que pip falla un poco y tengo que usar pip3 en su lugar.

Así que aquí lo que hice:

  1. pip3 install --update certify manualmente la pip3 install --update certify en un shell
  2. Elimine la línea de instalación certificada de la secuencia de comandos.
  3. Reran el guión y todo estuvo bien.

Tenga en cuenta que terminará con un enlace simbólico cert.pem en: /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/