我现在正在努力让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)
任何人都可以教我如何解决这个问题吗?
答案 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:
免责声明:将Chrome 67.0.3396.99与Windows 10 64位一起使用。