Python (pip) lanza incluso si se actualizó la cadena de certificados

Este es un seguimiento de una publicación anterior de SO .

Estoy usando Windows / cygwin y tengo la necesidad de que Python entienda un certificado de CA personalizado, ya que la infraestructura de red renuncia a todas las solicitudes de SSL con su propio certificado.

Si bash ejecutar pip search SimpleHTTPServer , pip search SimpleHTTPServer el siguiente mensaje de error:

 ... File "c:\users\erbe\appdata\local\programs\python\python35-32\lib\ssl.py", line 633, in do_handshake self._sslobj.do_handshake() ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:645) 

He intentado agregar los certificados a mi lista de certificados de confianza haciendo lo siguiente:

  1. Copie mi archivo .pem a / etc / pki / ca-trust / source / anchors
  2. update-ca-trust extract

He comprobado que esto funciona, ya que ahora puedo apuntar al archivo PEM generado y ejecutar pip con éxito: pip --cert /usr/local/ssl/cert.pem search SimpleHTTPServer :

 $ pip --cert tls-ca-bundle.pem search SimpleHTTPServer ComplexHTTPServer (0.1) - A Multithreaded Python SimpleHTTPServer SimpleTornadoServer (1.0) - better SimpleHTTPServer using tornado rangehttpserver (1.2.0) - SimpleHTTPServer with support for Range requests 

Sin embargo, quiero que esto funcione sin tener que especificar el certificado manualmente cada vez. Espero actualizar la cadena de certificados que Python utiliza:

 $ python -c "import ssl; print(ssl.get_default_verify_paths())" DefaultVerifyPaths(cafile=None, capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/usr/local/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/usr/local/ssl/certs') 

He verificado que a través de una serie de enlaces simbólicos, /usr/local/ssl/cert.pem apunta al mismo archivo. Sin embargo, si ejecuto pip , todavía recibo el mensaje de error [SSL: CERTIFICATE_VERIFY_FAILED] .

Desinstalé la versión de Python para Windows y reinstalé la versión de Pygon de Cygwin. Con ello, me encontré con easy_install-2.7 pip . Ahora al menos puedo ejecutar pip con la ruta completa del certificado sin un mensaje de error:

 $ pip --cert /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem search simpleHttpServer LittleHTTPServer (0.5.0) - Little bit extended SimpleHTTPServer SimpleHTTP404Server (0.2.0) - A Python SimpleHTTPServer, but serves 404.html if a page is not found. django-localsrv (0.1.2) - Django app for serving static content from different sources (files, strings, urls, etc.) at custom paths, 

Solo para estar seguro, también intenté actualizar el SSL_CERT_DIR varaible para apuntar a / etc / pki / ca-trust-extract / pem y establecer el SSL_CERT_FILE a / etc / pki / ca-trust-extract / pem / tls-ca-bundle .pem pero estos no funcionan:

 $ set | grep SSL SSL_CERT_DIR=/etc/pki/ca-trust/extracted/pem SSL_CERT_FILE=/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem $ python -c "import ssl; print(ssl.get_default_verify_paths())" DefaultVerifyPaths(cafile='/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem', capath='/etc/pki/ca-trust/extracted/pem', openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/usr/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/usr/ssl/certs') $ pip search simpleHttpServer Exception: Traceback (most recent call last): File "/usr/lib/python2.7/site-packages/pip-8.1.2-py2.7.egg/pip/basecommand.py", line 215, in main status = self.run(options, args) ... ... File "/usr/lib/python2.7/site-packages/pip-8.1.2-py2.7.egg/pip/_vendor/requests/adapters.py", line 477, in send raise SSLError(e, request=request) SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590) 

¿Qué estoy haciendo mal? ¿Es este un problema de cygwin vs Windows? ¿Qué archivos PEM necesito actualizar?

Puede agregar la opción de línea de comando pip de manera predeterminada a su archivo de configuración. En Windows, debe estar ubicado en% APPDATA% \ pip \ pip.ini.

Para agregar un certificado, coloque las siguientes líneas en el archivo:

 [global] cert = windows path to your certificate