Google App Engine-SSL InsecurePlatformWarning


Я использую библиотеку python requests в Google App Engine для отправки запросов GET на частный сервер. Когда я делаю запрос, я получаю следующее предупреждение:

requests/packages/urllib3/util/ssl_.py:79: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning

Согласно документации , на которую указывает, мне нужно либо обновить Python 2.7.x, который использует Гаэ, или использовать pyopenssl. Поскольку я не верю, что могу заставить Гэ использовать Python 2.7.9, я попытался использовать pyopenssl.

Следуя инструкциям на странице, Я загрузил три библиотеки предложено в каталог lib моего приложения и где я использую запросы, я пытаюсь ввести pyopenssl в urllib3 с помощью:

import requests.packages.urllib3.contrib.pyopenssl
requests.packages.urllib3.contrib.pyopenssl.inject_into_urllib3()

Однако это приводит к сбою в devserver и рабочем сервере со следующей обратной связью:

Traceback (most recent call last):


File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 240, in Handle
    handler = _config_handle.add_wsgi_middleware(self._LoadHandler())
  File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 299, in _LoadHandler
    handler, path, err = LoadObject(self._handler)
  File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 85, in LoadObject
    obj = __import__(path[0])
  File "/base/data/home/apps/s~servicey1564/1.383321878696068897/main.py", line 24, in <module>
    from API import setupautomatorAPI
  File "/base/data/home/apps/s~servicey1564/1.383321878696068897/API.py", line 12, in <module>
    from ServiceActivationTest import uploadSAT, getSATsForService
  File "/base/data/home/apps/s~servicey1564/1.383321878696068897/ServiceActivationTest/__init__.py", line 3, in <module>
    from requests.packages.urllib3.contrib import pyopenssl as pyopenssl
  File "/base/data/home/apps/s~servicey1564/1.383321878696068897/lib/requests/packages/__init__.py", line 95, in load_module
    raise ImportError("No module named '%s'" % (name,))
ImportError: No module named 'requests.packages.urllib3.contrib.pyopenssl'

Этот оператор импорта прекрасно работает в интерпретаторе Python и работает, если я снимаю pyopenssl в конце. pyopenssl также является первым файлом .py помимо __init__.py файлы в этом пути.

Я делаю здесь что-то не так? Есть ли более простой способ чтобы исправить InsecurePlatformWarning?

Обновление: после перехода на страницу API сокетов (спасибо shazow!) Я обнаружил, что часть моей проблемы заключалась в том, что httplib плохо себя вел, потому что мне не хватало переменной окружения. Это не избавило меня от предупреждения, но теперь мой сертификат принимается!

3 2

3 ответа:

(я не уверен на 100%, что это то, что вы имеете в виду, но это может быть более уместным ответом на ваш вопрос:)

Оказывается, есть новое поведение, которое является ошибкой в urllib3, проявляющейся в том, что AppEngine меняет доступные модули по умолчанию.

Традиционно, urllib3 пытается import ssl, который потерпел бы неудачу на старом AppEngine, то это было бы отступление к простому httplib, который является URLFetch за кулисами AppEngine. Теперь, похоже, AppEngine добавил модуль ssl в качестве части бета-версии своих сокетов, что испортило наш запасной вариант.

Эта ошибка исследуется здесь: https://github.com/shazow/urllib3/issues/583

В настоящее время вы можете вручную переопределить тип HTTPSConnection по умолчанию, который urllib3 использует как обычный httplib , а не PyOpenSSL, сделав что-то вроде этого перед созданием пулов:

from urllib3.connection import UnverifiedHTTPSConnection
from urllib3.connectionpool import HTTPSConnectionPool

# Override the default Connection class for the HTTPSConnectionPool.
HTTPSConnectionPool.ConnectionCls = UnverifiedHTTPSConnection

Теперь всякий раз, когда urllib3 использует HTTPSConnectionPool (которые такие вещи, как PoolManager выделяют автоматически), он будет использовать UnverifiedHTTPSConnectionS, которые эквивалентны в службу url Fetch на AppEngine .

Один раз выпуск #583 исправлено, вам больше не нужно будет этого делать.

Добавление в приложение следующего.yaml, согласно странице API сокетов , позволяет http-запросам на основе запросов правильно доставлять свои сертификаты.

env_variables:
   GAE_USE_SOCKETS_HTTPLIB : 'anyvalue'

Это не устраняет InsecurePlatformWarning, мои конкретные запросы, похоже, не затрагиваются тем, что вызывает это предупреждение.

Лучший способ решить проблему InsecurePlatformWarning в Google AppEngine-просто установить version: latest для библиотечного ssl в приложении.и YAML.

libraries:
- name: ssl
  version: latest
В то время как некоторые люди все еще могут иметь version: 2.7, как и я.

Как только это установлено, нет необходимости изменять GAE_USE_SOCKETS_HTTPLIB, как предложил Стивен Вендлинг. Нет необходимости устанавливать дополнительные библиотеки.