Python请求SSLError:https://gcm-http.googleapis.com上的握手不良

时间:2017-07-14 19:40:03

标签: python ssl google-api

尝试向GCM API发出Python请求,但证书尚未经过验证。

请求和证书包已更新

  • Python 2.7.6
  • CERTIFI == 2017年4月17日
  • 请求== 2.18.1
  • pyOpenSSL == 17.1.0

尝试调用其他服务器并返回正常:

错误消息:错误握手:错误([(' SSL例程',' SSL3_GET_SERVER_CERTIFICATE','证书验证失败') ],)

1 个答案:

答案 0 :(得分:1)

在研究这个问题时,我发现了一些有趣的结果。在我看来,这可能是问题所在。让我知道。

TL; DR

尝试使用certifi.old_where()。如果可行,那么您真的应该在服务器上升级到更新版本的OpenSSL。

来源

GitHub的:

https://github.com/certifi/python-certifi/issues/32

来自@Lukasa

  

您能否确认这是否与#26相同?也就是说,尝试将certifi.old_where()传递给请求的验证参数。

     

...

     

要明确的是,除了使用certifi.old_where()或升级OpenSSL之外,没有其他方法可以解决这个问题。您系统上的OpenSSL太旧而无法正确验证交叉签名的TLS证书,并且三个无法在我的问题上解决该问题。如果您使用certifi.old_where(),系统将面临重大风险,因为您将继续信任1024位RSA证书,这些证书自2012年以来一直被弃用,并且已经受到多次已知攻击。

certifi文件:

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。但是,如果您没有其他选择,这可能对您有用。