Python 2.7.11 httplib2抛出证书\u VERIFY_失败,因为SSL SNI websi的证书错误

2024-05-20 00:38:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个可以通过多个URL访问的网站,其中2个有SSL证书,使用sslsni提供服务(整个过程使用nginx)。在

这个设置对于浏览器和监视网站的python2.7.11代码都很有效,只要两个证书都有效。在

最近,其中一个证书过期了-这个证书没有用于任何事情(不用于入站流量,也不用于监视)。这对访问网站的浏览器没有影响,但它开始导致监视Python脚本中出现以下错误:

2016-12-24 02:09:49,351 - foo.__main__(140582120666944) - app_monitoring.py:90 - ERROR - Call to <lambda> Failed 1 times
Traceback (most recent call last):
  File "devops/monitoring/app_monitoring.py", line 88, in call_with_retry
    func(*args, **kwargs)
  File "devops/monitoring/app_monitoring.py", line 116, in <lambda>
    test_func=lambda: yapi_calls.test_api_on_all_datasets(Flags.yapi_url)),
  File "/usr/src/app/system_tests/yapi_calls.py", line 158, in test_api_on_all_datasets
    datasets = send(yapi_url, 'list_datasets', {})
  File "/usr/src/app/system_tests/yapi_calls.py", line 48, in send
    return gcloud.get_yapi(yapi_url).execute(api_call, req)
  File "/usr/src/app/cloudapi/yapi.py", line 23, in execute
    return self._execute(api_call, req, True)
  File "/usr/src/app/cloudapi/yapi.py", line 36, in _execute
    headers=headers)
  File "/usr/local/lib/python2.7/dist-packages/oauth2client/client.py", line 631, in new_request
    redirections, connection_type)
  File "/usr/local/lib/python2.7/dist-packages/httplib2/__init__.py", line 1609, in request
    (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
  File "/usr/local/lib/python2.7/dist-packages/httplib2/__init__.py", line 1351, in _request
    (response, content) = self._conn_request(conn, request_uri, method, body, headers)
  File "/usr/local/lib/python2.7/dist-packages/httplib2/__init__.py", line 1272, in _conn_request
    conn.connect()
  File "/usr/local/lib/python2.7/dist-packages/httplib2/__init__.py", line 1059, in connect
    raise SSLHandshakeError(e)
SSLHandshakeError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)

注意:我有一个有效的证书和一个过期的证书,问题是即使我使用有效证书通过URL,也会因为过期的证书而引发异常。

我用requests进行了检查,访问“good”URL没有问题,而如果访问过期的URL,则会得到预期的SSL错误-因此我怀疑这是httplib2处理SNI证书时特有的问题。在

不幸的是,我不能在这个流中切换到requests,因为这是一个外部库(在堆栈跟踪中可见)。在

除了安装一个新的有效的SNI证书(或切换到非SNI证书)之外,我还有什么可以做的吗?在

更新:我找到了一个适用于此案例的解决方案。

使用nginx提供sslsni时,仍然需要设置一个默认证书。 在本例中,默认的证书是过期的。 通过将默认证书更改为有效证书,错误就消失了。在

这种解决方法使我认为httplib2sslsni实现中存在一个bug——它似乎需要验证默认的证书,即使它不是请求域的证书。在


Tags: inpyapprequestlibpackagesusrlocal