2015-04-02 110 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。無需安裝額外的庫。