2013-10-15 31 views
26

我们在客户端安装了我们的根证书,而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)[email protected]:~$ 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 

版本:1.4.1 PIP

回答

31

不幸的是PIP不使用系统证书,但卷曲一样。

我找到了一个解决方案:

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

这是不是很好(卷曲和其他图书馆找到证书不添加参数),但作品。

如果你不想使用命令行参数,你可以设置在〜/将该.pip/pip.conf的证书:从http://curl.haxx.se/ca/cacert.pem

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

+1的--cert说法并没有为我,但配置文件的解决方案做了(OS X,Anaconda安装)工作 –

+2

试试这个: http://stackoverflow.com/a/28724886/41957 – chnrxn

19

我的解决办法是下载cacert.pem,并添加作为guettli路径cacert.pem~/.pip/pip.conf建议

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

我把它放在/etc/pip.conf(证书是/etc/ssl/certs/DigiCert_High_Assurance_EV_Root_CA.pem),它现在适用于所有用户 – Calimo

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)都没有产生值,则使用捆绑的f ile

请注意,pip不使用默认的SSL目录和文件(来自ssl.get_default_verify_paths())。但仅支持捆绑的CA文件。

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

+0

为什么是'需要安装pep8'行吗? – guettli

+0

这只是一个例子,我从其他答案 – arjenve

+0

噢,对不起,周五晚了。周末时间:-) – guettli

1

对我来说,没有任何配置文件变通办法。我使用PIP 1.5.4的Ubuntu 14.04

发表@arjenve该命令没有我的系统上工作的。我得到:/usr/bin/python: No module named _vendor.requests

UPDATE

的比我的第一个解决方法更好的解决方案是(在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 

较旧的替代方法

我的解决方法是创建一个从/etc/ssl/certs/ca-certificates.crt一个包文件和我公司的CRT(只需两个级联文件)。然后导出一个变量(把那我.bashrc)是这样的:

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