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:
- 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 )
- 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),
- 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.