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 ответа:
(я не уверен на 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
выделяют автоматически), он будет использоватьUnverifiedHTTPSConnection
S, которые эквивалентны в службу 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, как предложил Стивен Вендлинг. Нет необходимости устанавливать дополнительные библиотеки.