Google App Engine - SSL InsecurePlatformWarning

时间:2015-04-02 15:19:01

标签: python google-app-engine ssl python-requests urllib3

我在Google App Engine中使用python的requests库将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

根据指出的documentation,我需要升级GAE使用的Python 2.7.x,或者使用pyopenssl。由于我不相信我可以强迫GAE使用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'

这个import语句在Python解释器中工作正常,如果我在最后取消pyopenssl就可以工作。 pyopenssl也是该路径中除__init__.py文件之外的第一个.py文件。

我在这里做错了吗?有没有更简单的方法来修复InsecurePlatformWarning?

更新:进入套接字API页面后(谢谢shazow!)我发现我的部分问题是httplib行为不端,因为我缺少环境变量。这并没有消除警告,但我的证书现在被接受了!

3 个答案:

答案 0 :(得分:2)

(我不是100%确定这是你的意思,但这可能是你问题的一个更相关的答案:)

原来有一个新行为是urllib3中的一个错误,表现为AppEngine更改了他们的默认模块。

传统上,urllib3尝试import ssl在旧的AppEngine上失败,然后它将回退到普通的httplib,它是幕后的AppEngine的URLFetch。现在,看起来像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使用HTTPSConnectionPoolPoolManager自动分配的内容),它就会使用等同于URL Fetch service on AppEngineUnverifiedHTTPSConnection

问题#583修复后,您将不再需要这样做了。

答案 1 :(得分:1)

根据sockets API page,将以下内容添加到app.yaml,允许基于请求的http请求正确地提供其证书。

env_variables:
   GAE_USE_SOCKETS_HTTPLIB : 'anyvalue'

这并没有消除InsecurePlatformWarning,我的特殊要求似乎不会受到导致此警告的任何因素的影响。

答案 2 :(得分:0)

在Google AppEngine上解决InsecurePlatformWarning问题的最佳方法是在app.yaml中为库ssl设置version: latest

libraries:
- name: ssl
  version: latest

虽然有些人可能仍然version: 2.7,但就像我一样。

设置完成后,无需按照Steven Wendling的建议修改GAE_USE_SOCKETS_HTTPLIB。无需安装其他库。