Python SSL请求和Let的加密证书

时间:2016-01-15 14:03:46

标签: python ssl openssl python-requests lets-encrypt

我现在正在努力让requests库通过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 authority certificate,并且以下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)

任何人都可以教我如何解决这个问题吗?

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

在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)

答案 2 :(得分:0)

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

使用Chrome:

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

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