这是SSLError using requests for python的后续内容:
我刚刚在Mac OSX 10.8.5上安装了requests
。我第一次尝试requests.get
失败证书失败了:
SSLError: [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
上面的帖子说要查找/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/cacert.pem
,但实际上我甚至没有.../site-packages/requests
目录。我不清楚这是否应该由安装添加(我使用pip
)
其他主题和requests
文档说要安装certifi
,所以我做了。但现在我得到了一个不同的错误:
python -c 'import requests; requests.get("https://api.github.com/events")' /usr/lib/anaconda/lib/python2.7/site-packages/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
InsecurePlatformWarning
Traceback (most recent call last):
...
File "/usr/lib/anaconda/lib/python2.7/site-packages/requests/adapters.py", line 431, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:0D0890A1:asn1 encoding routines:ASN1_verify:unknown message digest algorithm
谢谢!
答案 0 :(得分:7)
请注意,您正在使用HTTPS
。如Requests manual
要检查主机的SSL证书,可以使用verify参数[...]默认情况下,验证设置为True
以下几种解决方法:
取自here:
如果您遇到以下错误之一:
error:0D0890A1:asn1 encoding routines:ASN1_verify:unknown message digest algorithm error:0D0C50A1:asn1 encoding routines:ASN1_item_verify:unknown message digest algorithm The software you are using might be compiled with a version too old of OpenSSL that does not take certificates signed with sha256WithRSAEncryption into account.
至少需要OpenSSL 0.9.8o来管理SHA256。 OpenSSl 0.9.7m仅为服务器确保部分管理 仅限模式。
openssl
版本
openssl version
OpenSSL 1.0.1k-fips 8 Jan 2015
如果版本小于OpenSSL0.9.8o
,则必须更新其版本(OS X):
brew update
brew install openssl
brew link --force openssl
如果这不起作用,请尝试这种方式:
brew uninstall openssl
rm -rf /usr/local/openssl
brew install openssl
openssl
之前安装OS X 10.10.3
并重新安装它的问题已修复openssl
取自here
默认情况下,请求捆绑了一组它信任,来源的根CA. 来自Mozilla信托商店。但是,这些只更新一次 每个请求版本。这意味着如果你固定一个请求版本 你的证书可能会变得非常过时。
从请求版本2.4.0开始,请求将尝试使用 来自certifi的证书(如果它存在于系统中)。这允许 用户无需更新其可信证书 更改在其系统上运行的代码。
出于安全考虑,我们建议经常升级证书!
换句话说,如果您有certifi
或更新版本,请尝试安装certifi
:
Request 2.4.0
希望这可以解决问题。
使用Google调查,我发现Python 2中的OpenSSL存在问题:
但是,我使用pip install certifi
,Python 2.7.6
和Requests 2.2.1
,一切都正常运行。
在其他情况下,如果您签署了主机证书,则可能需要告知OpenSSL 1.0.1f 6 Jan 2014
证书文件的路径。
requests.get
如果您想避免证书验证,则必须将requests.get("https://api.github.com/events", verify=True, cert=['/path/to/my/ca.crt'])
传递给verify=False
方法。
request.get
或来自python -c 'import requests; requests.get("https://api.github.com/events", verify=False)'
档案:
script.py
终端:
import requests
res = requests.get("https://api.github.com/events", verify=False)
print res
重要 :非常糟糕的主意;您可能被MITM攻击,这是一个重要的安全漏洞。