Python在Windows上请求时证书验证失败

4
我正在使用requests连接到一个REST API,我有一个证书束和一个.pem密钥,用于身份验证。这些证书和代码在我的Ubuntu机器上运行良好,所以我知道这些证书是有效的。
我在Linux上设置时遇到了类似的问题,当我将证书放在etc/pki/tls/certs中时,异常被抛出。但是当我将这些证书移到etc/ssl/certs中时,一切正常。
需要明确的是,我已经为这些证书的目录进行了哈希处理,虽然我不确定哈希的重要性。
因此,我的问题是:在Windows上应该把这些证书放在哪里?
下面是代码片段:
import requests

private_key = '\path\to\private\key.pem'
cert_bundle = '\path\to\bundle'
url = 'https://www.securedsite.com/api-entry'

session = requests.Session()
session.cert = private_key
session.verify = cert_bundle
try:
    resp = session.post(url)    
except:
    # Exception

我目前在Windows上拥有的证书:

'C:\stuff\admin\private\core_admin.pem'

'C:\stuff\admin\certs\'

软件版本:

  • Windows 10
  • Python 3.6.3
  • requests 2.18.4
  • openssl 1.0.2l

供参考,Linux机器为:

  • Ubuntu 16.04.1 4.13.0-39-generic
  • Python 3.6.3
  • requests 2.18.4
  • openssl 1.0.2l

在代码中,我使用pathlib的Path来构建路径,以便在Linux和Windows之间切换,并且所有东西都在Linux上工作。 我认为我只需要指导一下在哪里放置我的证书。

2个回答

4

如果你使用的是Windows系统,通常你需要将证书导入到证书管理器中(点击“开始”,然后选择“管理计算机证书”或“管理用户证书”,具体取决于你的范围)。这样就可以将它们放在适当的位置。Python使用这个证书存储。

然而,requests默认使用自己的证书,但你可以绕过它。请参见SSL failure on Windows using python requests以获取更多详细信息。

请注意,这是一个深入的问题。请参见https://github.com/psf/requests/issues/2966以获取更多背景信息。


这条信息不准确,因为 Python 使用的证书存储库与 requests 库使用的证书存储库不同。 - Jari Turkia
如果你阅读我的回答,你会发现我确实指出了那一点。 - David Pettersson
不是的。使用requests库时,Python完全不使用本地的Windows证书系统。 - Jari Turkia
我并不反对:requests使用自己的证书存储。 :-)这个人实际上在问“在Windows上应该把这些证书放在哪里?”我告诉他们将它们放在证书管理器中,这是Windows上正确的位置。一旦放置在那里,他们可以配置requests使用该证书而不是依赖于requests所依赖的certifi捆绑包。 - David Pettersson
1
我同意你的看法。将证书添加到Windows本地证书存储并将certifi-win32添加到应用程序中将是一个不错的解决方案。 - Jari Turkia

3

默认情况下,Windows 中的 Python requests 库不使用默认的 Windows 证书存储,而是使用由 https://pypi.org/project/certifi/ 提供的 PEM 文件。

要添加新的 CA 根证书,请执行以下任一操作:

  • 找到您的 PEM 文件存储位置:python -c "import certifi ; print(certifi.where())",将您的 CA 根证书添加到该文件中。
  • 安装 https://pypi.org/project/python-certifi-win32/,这将使 certifi 能够使用 Windows 证书存储。在那里安装您的 CA 根证书。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接