Python 如何忽略使用自签名证书将pip安装到私有pypi服务器时引发的安全警告

Python 如何忽略使用自签名证书将pip安装到私有pypi服务器时引发的安全警告,python,ssl,pip,Python,Ssl,Pip,我认为这是一个利基情景。我有一个在Linux服务器上运行的pypi服务器。使用以下命令从中检索包: pip安装--额外索引url http://:8080 MyPackage 从私人回购协议中下载的软件包的工作原理与预期一致 但是,由于使用以下命令将自签名证书引入等式(我没有此IP的域): pip安装--cert apache-selfsigned.crt--额外索引urlhttps://UN:PW@:443 MyPackage 我得到以下错误(尽管它仍然可以工作,正如您在底部看到的): 我使用

我认为这是一个利基情景。我有一个在Linux服务器上运行的pypi服务器。使用以下命令从中检索包:

pip安装--额外索引url http://:8080 MyPackage

从私人回购协议中下载的软件包的工作原理与预期一致

但是,由于使用以下命令将自签名证书引入等式(我没有此IP的域):

pip安装--cert apache-selfsigned.crt--额外索引urlhttps://UN:PW@:443 MyPackage

我得到以下错误(尽管它仍然可以工作,正如您在底部看到的):

我使用Apache2作为反向代理将端口443转发到pypi端口

该证书是“有效”的,但显然没有向CA注册。它可以很好地用于加密和通过web浏览器连接(一旦我接受了“风险”)。因此,我知道证书/密钥工作正常

pip在决定继续使用未经验证的证书之前尝试了5次,但失败了,这似乎是非常低效的,证书中有什么问题吗?或者只是pip的依赖项不喜欢自签名证书,并且在承认其正确性之前总是会失败5次。

当使用
--额外索引url
时,
pip
在搜索包时仍然会在额外索引中使用PyPI。不幸的是,无法指定“额外索引证书”,因此当您通过
--cert
时,
pip
将对所有索引主机使用证书,包括
pypi.org
。这就是为什么会出现
证书验证失败
错误的原因。要避免这种情况,您可以:

  • 在系统范围内安装证书,因此您根本不必通过
    --cert
    。具体步骤取决于操作系统,而且您还需要虚拟环境的其他步骤
  • 使用
    --index url=--cert=my.crt
    -注意,在这种情况下
    pip
    根本不会查询PyPI,因此您将只能安装由您自己的索引提供的软件包。但是,像
    devpi
    这样的体面索引服务器可以充当PyPI的代理,所以问题不大
  • 信任PyPI主机:
    --额外索引url=--cert=my.cert--trusted host=PyPI.org--trusted host=files.pythonhosted.org
    -这将跳过PyPI主机验证,因此不安全,应该只是一种临时解决方法

由于
额外索引url
pip
在PyPI上搜索,并且由于
cert
,它使用它来检查
PyPI.org
主机,显然失败了。作为一种解决方法,如果您需要通过额外索引url使用回购协议,您可以使用
--trusted host=pypi.org--trusted host=files.pythonhosted.org
;然而,一个合适的解决方案是在系统范围内安装一个绑定到DN的合适的自签名证书。此外,如果您使用的是
--cert
,则不需要
--trusted host=
。或者您可以完全忽略PyPI,通过
--index url=
从您自己的索引服务器安装所有内容。其余取决于服务器impl;您需要自己托管所有包依赖项,或者使用充当PyPI代理的
devpi
(本地不可用的包将从PyPI下载)。谢谢您,为了避免混淆,--trusted host已从问题中删除,事实上,在我试图找到解决方案的“反复试验”过程中,我在阅读您的信息之前发现了这一点。我希望我知道——索引url,简而言之,这是我的答案,请适当地发布一个答案,因为你已经为我解决了这个问题

Collecting MyPackage
  Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:727)'),)': /simple/MyPackage/
  Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:727)'),)': /simple/MyPackage/
  Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:727)'),)': /simple/MyPackage/
  Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:727)'),)': /simple/MyPackage/
  Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:727)'),)': /simple/MyPackage/
/usr/share/python-wheels/urllib3-1.22-py2.py3-none-any.whl/urllib3/connectionpool.py:860: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
Installing collected packages: MyPackage
Successfully installed MyPackage-0.2.0