(1个答案)
Python Urllib2 SSL error
(1个答案)
2年前关闭。
尝试向GCM API发出Python请求,但未验证证书。
请求和证明包已更新
Python 2.7.6
证书== 2017.4.17
要求== 2.18.1
pyOpenSSL == 17.1.0
试图调用其他服务器并返回就可以了:
r = request.get('https://graph.facebook.com/spotify')[确定]
r = request.get('https://graph.facebook.com/spotify',verify = certifi.where())[确定]
r = request.get('https://gcm-http.googleapis.com')[NOK]
r = request.get('https://gcm-http.googleapis.com',verify = certifi.where())[NOK]
错误消息:握手错误:错误([[('SSL例程','SSL3_GET_SERVER_CERTIFICATE','证书验证失败')],)
最佳答案
在研究此问题时,我遇到了一些有趣的结果。在我看来,这可能是问题所在。让我知道。
TL; DR
尝试使用certifi.old_where()
。如果可以,那么您确实应该在服务器上升级到OpenSSL的较新版本。
资料来源
的GitHub:
https://github.com/certifi/python-certifi/issues/32
从@Lukasa
您能确认这是否与#26问题相同吗?也就是说,尝试将certifi.old_where()传递给请求的verify参数。
...
需要明确的是,除了使用certifi.old_where()或升级OpenSSL之外,没有其他针对Python的修复程序。您系统上的OpenSSL太旧,无法正确验证交叉签名的TLS证书,因此无法通过三种方法来解决该问题。如果您使用certifi.old_where(),则系统将面临巨大风险,因为您将继续基于1024位RSA证书建立信任,该证书自2012年以来就已弃用,并且已经受到多种已知攻击。
证明文件:
https://pypi.python.org/pypi/certifi
1024位根证书
浏览器和证书颁发机构得出的结论是,对于证书(尤其是根证书),1024位密钥的强度是不可接受的。因此,Mozilla已从其软件包中删除了任何弱证书(即1024位密钥),并用同一CA中等效的强证书(即2048位或更高密钥)替换了该证书。由于Mozilla从其捆绑软件中删除了这些证书,因此certifi也将其删除。
不幸的是,旧版本的OpenSSL(小于1.0.2)有时无法验证使用强根的证书链。因此,如果您无法使用certifi.where()机制来验证证书,则可以通过调用certifi.old_where()来有意地将1024位根重新添加到包中。在生产中不建议这样做:如果可能的话,应该升级到较新的OpenSSL。但是,如果您没有其他选择,这可能对您有用。
关于python - Python请求SSLError:https://gcm-http.googleapis.com上的握手错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45110498/