2015-04-02 193 views
2

我在Google App Engine中使用python的requests库向专用服务器发送GET请求。当我提出要求我得到这样的警告:Google App Engine - SSL InsecurePlatformWarning

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 

根据指向,我需要或者升级过去这GAE使用Python 2.7.x,或使用pyopenssl的documentation。由于我不相信我可以强制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是行为不端,因为我缺乏一个环境变量。这并没有摆脱警告,但我的证书正在被接受!

+0

嗯,我还没有完整的答案,但有一些提示:我不相信PyOpenSSL适用于AppEngine,因为它是一个编译模块。 AppEngine提供了它自己的版本。也许你需要启用'sockets' API来获得一个合适的SSLContext? https://cloud.google.com/appengine/docs/python/sockets/ – shazow 2015-04-02 17:04:34

+0

我相信我已启用套接字。我的理解是,如果启用计费,套接字将自动可用。 – 2015-04-02 17:57:43

回答

2

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

原来有一个新的行为是表现在urllib3错误AppEngine更改其可用的默认模块。

传统上,urllib3尝试使用import ssl,这会在旧的AppEngine上失败,然后回退到原始的httplib,这是幕后的AppEngine的URLFetch。现在,看起来像AppEngine添加了一个ssl模块作为其套接字测试版的一部分,这使得我们的回退失效。手动https://github.com/shazow/urllib3/issues/583

暂时,您可以覆盖默认HTTPSConnection键入urllib3使用是普通httplib一个,而不是一个通过使之前做这样的事情PyOpenSSL

这个bug这里正在调查任何池:

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 service on AppEngine

一旦问题#583已修复,您将不再需要这样做。

+0

尝试导入:'from urllib3.connection import UnverifiedHTTPSConnection' raise'No modules named urllib3.connection' for me。有什么建议么? – kolinko 2015-06-08 11:46:44

+0

@kolinko更新到最新的urllib3,目前v1.10.4。 :)'pip安装-U urllib3' – shazow 2015-06-09 11:45:43

+0

@shazow,这是未经验证的HTTPSConnection更安全吗? (我假设,根据名称,它不验证HTTPS证书)。这种方法比只禁用urllib3警告更好吗? Google App Engine是否不支持执行已验证请求的机制? – 2015-06-24 14:39:37

1

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

env_variables: 
    GAE_USE_SOCKETS_HTTPLIB : 'anyvalue' 

这并不能消除InsecurePlatformWarning,似乎我的特别请求不被任何导致此警告的影响。

0

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

libraries: 
- name: ssl 
    version: latest 

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

设置完成后,不需要按照Steven Wendling的建议修改GAE_USE_SOCKETS_HTTPLIB。无需安装额外的库。