without txt sslerror run org failed error check certificate_verify_failed python curl ssl pip

python - txt - pip: cert failed, pero curl funciona



sslerror ssl certificate_verify_failed certificate verify failed(_ ssl c 661 (4)

Instalamos nuestro certificado raíz en el cliente y la conexión https funciona para curl .

Pero si tratamos de usar pip , falla:

Could not fetch URL https://installserver:40443/pypi/simple/pep8/: There was a problem confirming the ssl certificate: <urlopen error [Errno 1] _ssl.c:499: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed>

El certificado está en el cliente. Ver:

(foo_fm_qti)foo_fm_qti@vis-work:~$ curl -v https://installserver:40443/pypi/simple/pep8/ * About to connect() to installserver port 40443 (#0) * Trying 127.0.0.1... connected * Connected to installserver (127.0.0.1) port 40443 (#0) * successfully set certificate verify locations: * CAfile: none CApath: /etc/ssl/certs/ * SSLv3, TLS handshake, Client hello (1): * SSLv3, TLS alert, Client hello (1): * SSLv3, TLS handshake, Server hello (2): * SSLv3, TLS handshake, CERT (11): * SSLv3, TLS handshake, Server key exchange (12): * SSLv3, TLS handshake, Server finished (14): * SSLv3, TLS handshake, Client key exchange (16): * SSLv3, TLS change cipher, Client hello (1): * SSLv3, TLS handshake, Finished (20): * SSLv3, TLS change cipher, Client hello (1): * SSLv3, TLS handshake, Finished (20): * SSL connection using DHE-RSA-AES256-SHA * Server certificate: * subject: C=DE; ST=Sachsen; L=Chemnitz; O=FOO-COM GmbH; OU=DV; CN=gray.foo-com.lan; [email protected] * start date: 2013-09-09 10:47:50 GMT * expire date: 2019-05-24 10:47:50 GMT * subjectAltName: installserver matched * issuer: C=DE; ST=Sachsen; L=Chemnitz; O=FOO-COM GmbH; CN=FOO-COM Root CA; [email protected] * SSL certificate verify ok. > GET /pypi/simple/pep8/ HTTP/1.1

Versión: pip 1.4.1


Desafortunadamente, pip no usa los certs del sistema, pero Curl sí lo hace.

Encontré una solución:

pip --cert /etc/ssl/certs/FOO_Root_CA.pem install pep8

Esto no es bueno (Curl y otras bibliotecas encuentran el certificado sin agregar un parámetro) pero funciona.

Si no desea utilizar el argumento de línea de comando, puede establecer el certificado en ~ / .pip / pip.conf:

[global] cert = /etc/ssl/certs/Foo_Root_CA.pem


Mi solución es descargar cacert.pem de http://curl.haxx.se/ca/cacert.pem y agregar la ruta de cacert.pem a ~/.pip/pip.conf como sugirió guettli

[global] cert = /path/to/cacert.pem


Para mí, ninguna de las soluciones de configuración de archivos funcionó. Estoy usando pip 1.5.4 en Ubuntu 14.04

El comando publicado por @arjenve tampoco funcionaba en mi sistema. Obtengo: /usr/bin/python: No module named _vendor.requests

ACTUALIZAR

Una solución aún mejor que mi primera solución es instalar primero el certificado en el sistema (para mí en ubuntu esto sería)

sudo cp ~/my_cert.crt /usr/local/share/ca-certificates/ sudo update-ca-certificates

Lo anterior actualiza automáticamente el archivo del paquete (verificando en la parte inferior de /etc/ssl/certs/ca-certificates.crt , ahora debería ver el mismo certificado que en my_cert.crt )

Ahora exporta esa ruta a PIP_CERT y PIP_CERT a tu .bashrc :

echo export PIP_CERT=/etc/ssl/certs/ca-certificates.crt >> ~/.bashrc

TRABAJOS MÁS ANTIGUOS

Mi solución fue crear un archivo de paquete desde /etc/ssl/certs/ca-certificates.crt y el crt de mi empresa (simplemente concatena ambos archivos). Y luego exportar una variable (poner eso en mi .bashrc ) de esta manera:

export PIP_CERT=/my/path/to/the/bundle.crt


Yo suelo:

export PIP_CERT=`python -m pip._vendor.requests.certs` pip install pep8

PIP siempre valida el certificado de las conexiones HTTPS (y todos los paquetes pypi se redireccionan a HTTPS).

El algoritmo para determinar el archivo CA se basa en 3 pasos:

  1. Busque en una lista de ubicaciones predeterminadas para diferentes distribuciones de Linux ( en mi caso, este archivo resultó desactualizado, ya que estoy construyendo sobre una distribución de Linux muy antigua )
  2. Si está disponible, anule el valor encontrado en (1) de un valor en el archivo pip.conf, el entorno o la línea de comandos (en ese orden),
  3. Si tanto (1) como (2) no dieron como resultado un valor, use un archivo agrupado

Tenga en cuenta que pip no utiliza los directorios y archivos SSL predeterminados (desde ssl.get_default_verify_paths ()). Pero solo es compatible con un archivo CA incluido.

PIP admite una acción de línea de comando para listar el archivo incluido desde el paso 3 y eso es lo que uso para esta respuesta.