This question already has answers here:
Troubleshooting “ssl certificate verify failed” error
                                
                                    (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/

10-10 04:13