pip:cert失败了,但卷曲有效

时间:2013-10-15 08:56:19

标签: python curl ssl pip

我们在客户端安装了我们的根证书,https连接适用于curl

但如果我们尝试使用pip,则会失败:

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>

证书在客户端。参见:

(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; emailAddress=info@foo-com.de
*    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; emailAddress=info@foo-com.de
*    SSL certificate verify ok.
> GET /pypi/simple/pep8/ HTTP/1.1

版本:pip 1.4.1

4 个答案:

答案 0 :(得分:36)

不幸的是,pip不使用系统证书,但curl会这样做。

我找到了解决方案:

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

这不太好(卷曲和其他库在没有添加参数的情况下找到证书)但是有效。

如果您不想使用命令行参数,可以在〜/ .pip / pip.conf中设置证书:

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

答案 1 :(得分:21)

我的解决方案是从http://curl.haxx.se/ca/cacert.pem下载cacert.pem 并根据guettli建议将cacert.pem的路径添加到~/.pip/pip.conf

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

答案 2 :(得分:4)

我用:

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

pip install pep8

PIP始终验证HTTPS连接的证书(并且所有pypi包都重定向到HTTPS)。

确定CA文件的算法基于3个步骤:

  1. 查看不同Linux发行版的默认位置列表 (在我的情况下,这个文件被证明是过时的,因为我正在构建一个非常旧的Linux发行版
  2. 如果可用,请从pip.conf文件,环境或命令行(按此顺序)中的值覆盖(1)中的值,
  3. 如果(1)和(2)都没有产生值,请使用捆绑文件
  4. 请注意,pip不使用默认的SSL目录和文件(来自ssl.get_default_verify_paths())。但仅支持捆绑的CA文件。

    PIP确实支持命令行操作来列出步骤3中的捆绑文件,这就是我用于此答案的内容。

答案 3 :(得分:3)

对我来说,配置文件解决方法都没有奏效。我在 Ubuntu 14.04

上使用 pip 1.5.4

@arjenve发布的命令也不能在我的系统上运行。我得到:/usr/bin/python: No module named _vendor.requests

<强>更新

比我的第一个解决方法更好的解决方案是首先在系统上安装证书(对于我来说,这将是ubuntu)

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

之前会自动更新捆绑文件(在/etc/ssl/certs/ca-certificates.crt底部检查您现在应该看到与my_cert.crt中相同的证书)

现在将该路径导出到PIP_CERT并将其添加到.bashrc

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

OLDER WORKAROUND

我的解决方法是从/etc/ssl/certs/ca-certificates.crt和我公司的crt创建一个捆绑文件(只是连接两个文件)。然后导出一个变量(把它放在我的.bashrc上),如下所示:

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