我们在客户端安装了我们的根证书,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
答案 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个步骤:
请注意,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