python SSL证书验证在某些分发命令上失败

时间:2016-10-11 05:15:28

标签: python certificate windows-firewall twine

我正在尝试通过twine upload <file>将Python文件上传到PyPi,但我收到了SSL错误:

C:\pypubsub>twine upload dist\PyPubSub-4.0.0rc1-py3-none-any.whl
Uploading distributions to https://upload.pypi.org/legacy/
Uploading PyPubSub-4.0.0rc1-py3-none-any.whl
SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:645)

使用SSL的其他Python脚本也存在同样的问题,例如

  • python setup.py bdist_wheel upload <my_package>
  • pip install <any_package>;但是我可以在任何--trusted-host pypi.python.org命令中添加pip install,并且依赖项的安装和下载将成功

这种情况发生在我公司的笔记本电脑上,无论是在家还是工作,但在我的笔记本电脑上却不会发生。

为了解决这个问题,我基本上尝试了SO answer to similar problem(即导出twine试图验证的证书 - 可能是pypi.python.org的证书 - 然后告诉twine使用它):

  1. 来自chrome,我去了https://pypi.pythong.org,点击了URL旁边的锁,然后点击了详细信息,查看证书,详细信息,复制到文件。这会生成一个.CER文件。
  2. 我使用SSL Converter将.CER文件从DER格式转换为PEM格式。这创建了一个.CRT文件。
  3. 我用twine upload <my_package> --cert <path to CRT file>来缠绕;这次SSL错误是SSLError: [SSL] PEM lib (_ssl.c:2846)
  4. 然后我尝试按照Opting Out中的说明修补c:\Python35\lib\ssl.py选择退出服务器证书验证:我将行_create_default_https_context = create_default_context替换为_create_default_https_context = _create_unverified_context。使用原始CERTIFICATE_VERIFY_FAILED错误重新运行twine命令失败。

    我不是那么熟悉证书,所以我现在还有什么可尝试的。

1 个答案:

答案 0 :(得分:1)

您可以传递--cert标志,告诉twine使用哪个证书。

twine upload dist\PyPubSub-4.0.0rc1-py3-none-any.whl --cert <path-to-.pem-file>

要将.cer转换为.pem文件,请执行以下操作。

openssl x509 -inform der -in certificate.cer -out certificate.pem

--cert标志对于使用自定义ssl证书的人来说至关重要。如果您使用的是公司网络,则上述修复程序应该将您排除在外。向管理员询问ssl证书:)