11

我目前正在努力让请求库使用Let's Encrypt证书GET对我的站点执行一个简单的请求。该网站一切正常,我可以从 Chrome 访问它。(我现在正在运行 OSX El Capitan)。

首先,我尝试GET向该站点发出请求:

>>> import requests
>>> requests.get('https://example.com')

这给了我:

requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)

然后我尝试了各种方法,包括获取Let's Encrypt 授权证书,以下openssl命令成功验证了我网站的证书:

> openssl s_client -CAfile ./letsencryptauthorityx1.pem -connect example.com:443

其输出包括以下内容:

...
SSL-Session:
    Protocol  : TLSv1
    Cipher    : DHE-RSA-AES256-SHA
    Session-ID: ...
    Session-ID-ctx: 
    Master-Key: ...
    Key-Arg   : None
    Start Time: 1452865123
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

也许我在这里遗漏了一些东西,但在我看来,我的网站好像已经根据我提供的 Let's Encrypt 授权证书进行了验证。所以,我很高兴地将我的 Python 代码更改为:

>>> requests.get('https://example.com', verify='./letsencryptauthorityx1.pem')

但我仍然不断收到requests.exceptions.SSLError错误。我也尝试过使用DER授权证书的格式,但后来我收到以下错误requests

requests.exceptions.SSLError: unknown error (_ssl.c:2825)

有人可以教育我如何解决这个问题吗?

4

3 回答 3

6

听起来您机器上的 CA CERTS 不是最新的,或者 Web 服务器未配置为提供完整的证书链。

于 2016-03-15T21:48:31.597 回答
1

对于在寻找此问题的Windows修复程序时偶然发现这篇文章的任何迷失的灵魂。

使用铬:

  1. 使用 HTTPS 打开 URL。
  2. 在地址栏上单击“安全”的位置。
  3. 点击证书。
  4. 转到“认证路径”选项卡。
  5. 选择“Let's Encrypt Authority X3”(上一级),然后单击“查看证书”。
  6. 转到“详细信息”选项卡,然后单击“导出到文件”。
  7. 在向导上单击下一步并选择“Base-64 编码 X.509 (.CER)”,再次单击下一步。
  8. 为文件选择一个文件夹和名称(记住这个目录)。
  9. 转到该文件夹​​并右键单击证书,然后单击“安装证书”。
  10. 选择本地计算机(需要管理员权限),单击下一步。
  11. 选择“自动选择证书存储...”(默认),单击下一步。
  12. 单击完成。
  13. 再次运行您的 Python 脚本。

免责声明:将 Chrome 67.0.3396.99 与 Windows 10 64 位一起使用。

于 2018-07-13T20:06:00.057 回答
1

在 OSX 上,您可以将钥匙串访问权限中的所有证书导出到 .pem 文件,然后将请求指向该文件: http: //movingpackets.net/2015/03/18/telling-openssl-about-your-root-certificates /

CA_BUNDLE = path_to_your_exported_file.pem
response = requests.get(user_account_url, verify=CA_BUNDLE)
于 2016-07-20T02:54:00.943 回答