1

尝试安装 Google EarthExplorer。我在一个强大的公司防火墙内,并且必须检查 Chrome 使用的证书来验证正在验证的服务器/地址(使用 Chrome 的开发工具)。

经过一番阅读 - 情况看起来是这样的:

1)在对象上调用Initialize方法时,用于管理连接。 eeeerequests

2) 要正确配置 VirtualEnv,我必须配置我的 virtualenv 以使用组织提供的证书。基于这个 SE(SE Python SSL Requests...),我了解到 python 堆栈正在使用的事实,以及在 pythonrequestscertifi管理 SSL 的证书包。

3) 配置提供的证书(与 Chrome 使用的证书匹配)后,我可以使用请求在我的 VirtualEnv 中打开与谷歌的连接。伟大的!

(earthengine) X:\_01_VirtualEnvs\earthengine>python
Python 2.7.10 (default, May 23 2015, 09:40:32) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> requests.get("https://earthengine.google.com/", verify = True)
<Response [200]>
>>>

我认为这现在正在“工作”......当我在 VirtualEnv 之外尝试相同的操作时,我收到了失败的SSL3_GET_SERVER_CERTIFICATE...消息。这让我知道我在正确的地方获得了证书,并且它似乎工作正常。

但是,我仍然在以下方面遇到错误ee.Initialize()

>>> ee.Initialize()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "X:\_01_VirtualEnvs\earthengine\lib\site-packages\ee\__init__.py", line 9
3, in Initialize
    ApiFunction.initialize()
  File "X:\_01_VirtualEnvs\earthengine\lib\site-packages\ee\apifunction.py", lin
e 151, in initialize
    signatures = data.getAlgorithms()
  File "X:\_01_VirtualEnvs\earthengine\lib\site-packages\ee\data.py", line 410,
in getAlgorithms
    return send_('/algorithms', {}, 'GET')
  File "X:\_01_VirtualEnvs\earthengine\lib\site-packages\ee\data.py", line 738,
in send_
    response, content = send_with_backoff()
  File "X:\_01_VirtualEnvs\earthengine\lib\site-packages\ee\data.py", line 735,
in send_with_backoff
    'Unexpected HTTP error: %s' % e.message)
ee.ee_exception.EEException: Unexpected HTTP error: [Errno 1] _ssl.c:510: error:
14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

有人对这里出了什么问题有任何想法吗?我认为 ee 正在使用requests,因此正确设置了 python 环境requests

从查看异常回溯,似乎ee有基于回溯签名相似性的子类requests......我读对了吗?两种情况下的回溯都指向相同的_ssl.c:510失败 - 在同一行的相同文件名上失败?

有没有办法从异常中获取更多信息?在这一点上,我真的很茫然。

4

2 回答 2

2

所以看起来 EE 堆栈正在使用 httplib2 来处理身份验证。这提供了几个选项:

data.py ~ line 700 覆盖 SSL 检查(快速而肮脏)中:

http = httplib2.Http(timeout=(_deadline_ms / 1000.0) or None, disable_ssl_certificate_validation=True)

看起来你应该能够httplib2在实例化 http 连接对象时明确指示:

HTTPLIB_CA_CERTS_PATH = os.environ.get('HTTPLIB_CA_CERTS_PATH') http = httplib2.Http(timeout=(_deadline_ms / 1000.0) or None, ca_certs=HTTPLIB_CA_CERTS_PATH)

我在ca_certs_locator模块中找到了这个,__init__.py. 它是在ee.Initialize()方法中获取的(可能通过某些东西data.py但我无法回溯它。无论如何,第二个选项(显式传递 ca_certs 路径)并不能解决问题。

我正在使用禁用 SSL 验证,并且仅使用 earthengine.google.com 端点。

于 2017-06-01T20:18:06.907 回答
0

在最近的版本中,该ee.Initialize()方法接受一个http_transport参数,所以我们不再需要修改它的源代码,而是在我们自己的代码中创建它:

_http_transport = httplib2.Http(disable_ssl_certificate_validation=True)
ee.Initialize(credentials, http_transport=_http_transport)

这样你也可以控制ca_certs选项,但我还没有尝试过。

于 2020-09-11T12:57:51.673 回答