2

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

指摘しているドキュメントによると、GAE が使用する過去の Python 2.7.x をアップグレードするか、pyopenssl を使用する必要があります。GAE に Python 2.7.9 を強制的に使用させることができるとは思えないので、pyopenssl を使用しようとしました。

ページの指示に従って、提案された 3 つのライブラリをアプリの 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 が正しく動作していないことであることがわかりました。これは警告を取り除きませんでしたが、私の証明書は現在受け入れられています!

4

3 に答える 3

2

(これがあなたの言いたいことであると100%確信しているわけではありませんが、これはあなたの質問に対するより適切な回答かもしれません:)

AppEngine が使用可能なデフォルト モジュールを変更することによって明示される urllib3 のバグである新しい動作があることが判明しました。

伝統的に、urllib3 は古い AppEngine で失敗するものを試行し、AppEngine の舞台裏であるimport sslプレーンにフォールバックします。さて、AppEngineがソケット ベータ版の一部としてモジュールを追加したようです。これにより、フォールバックが台無しになりました。httplibURLFetchssl

このバグはこちらで調査中です: https://github.com/shazow/urllib3/issues/583

当面の間、プールを作成する前に次のようなことを行うことhttplibで、urllib3 が使用するデフォルトの HTTPSConnection タイプを手動でオーバーライドして、単純なタイプにすることができます。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自動的に割り当てられるなどの)を使用するときはいつでも、 AppEngine の URL Fetch サービスUnverifiedHTTPSConnectionと同等の を使用します。

問題#583が修正されると、これを行う必要はなくなります。

于 2015-04-08T06:22:56.167 に答える