Google EarthEngine Python в VirtualEnv: запросы могут подключаться к google.com, но ee.Initialize() завершается с ошибкой получения SSL-сертификата

Попытка получить работающую установку Google EarthExplorer. Я нахожусь внутри надежного корпоративного брандмауэра, и мне пришлось проверить сертификат, используемый Chrome, для проверки проверяемого сервера/адреса (с помощью инструментов разработчика Chrome).

После некоторого чтения - похоже, ситуация такова:

1) при вызове метода Initialize для объекта ee ee использует requests для управления соединением.

2) Чтобы правильно настроить VirtualEnv, мне пришлось настроить мой virtualenv для использования сертификата, предоставленного организацией. На основе этого SE (SE Python SSL Requests...) я был осведомлен о том, что стек python использует requests, который вместе с certifi управляет пакетом сертификатов для SSL на python.

3) После настройки предоставленного сертификата (соответствующего используемому в Chrome) я могу открыть соединение с Google внутри моего 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 — сбой с одним и тем же именем файла в одной строке?

Есть ли способ получить больше информации об исключении? Я действительно в растерянности в этот момент.


person GeospatialD    schedule 22.05.2017    source источник


Ответы (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.

person GeospatialD    schedule 01.06.2017

В более поздних версиях метод ee.Initialize() принимает аргумент http_transport, поэтому нам больше не нужно изменять его исходный код, а нужно создать его самостоятельно:

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

Таким образом, вы также можете управлять опцией ca_certs, но я не пробовал.

person Ciprian Tomoiagă    schedule 11.09.2020