【问题标题】:Google App Engine - SSL InsecurePlatformWarningGoogle App Engine - SSL 不安全平台警告
【发布时间】:2015-04-02 15:19:00
【问题描述】:

我在 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()

但是,这在开发服务器和生产服务器中失败,并带有以下回溯:

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 行为不端,因为我缺少环境变量。这并没有消除警告,但我的证书现在正在被接受!

【问题讨论】:

  • 嗯,我还没有完整的答案,但有一些提示:我不相信 PyOpenSSL 可以在 AppEngine 上运行,因为它是一个编译模块。 AppEngine 提供了自己的版本。也许您需要启用sockets API 以获得正确的 SSLContext? cloud.google.com/appengine/docs/python/sockets
  • 我相信我启用了套接字。我的理解是,如果启用计费,套接字将自动可用。

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


【解决方案1】:

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

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

传统上,urllib3 尝试使用 import ssl,这在旧 AppEngine 上会失败,然后它会回退到普通的 httplib,这是 AppEngine 在幕后的 URLFetch。现在,看起来 AppEngine 添加了一个 ssl 模块作为其套接字测试版的一部分,这搞砸了我们的后备。

这里正在调查此错误:https://github.com/shazow/urllib3/issues/583

目前,您可以通过在创建任何池之前执行以下操作来手动覆盖 urllib3 使用的默认 HTTPSConnection 类型,使其成为普通的 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 这样的东西会自动分配)时,它将使用 UnverifiedHTTPSConnections,相当于 URL Fetch service on AppEngine

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

【讨论】:

  • 尝试此导入:from urllib3.connection import UnverifiedHTTPSConnection 为我提升 No module named urllib3.connection。有什么建议吗?
  • @kolinko 更新到最新的 urllib3,目前是 v1.10.4。 :) pip install -U urllib3
  • @shazow,这个 UnverifiedHTTPSConnection 是否更安全? (根据名称,我假设它不验证 HTTPS 证书)。这种方法比仅仅禁用 urllib3 警告更好吗? Google App Engine 是否不支持执行验证请求的机制?
  • @ClintDoriot 您认为它并不安全是正确的。 github.com/shazow/urllib3/issues/583 仍然很出色。如果此错误影响到您,Google AppEngine 开发者倡导团队要求我指示人们直接与他们联系。
  • 该组与 Google Cloud 支持组不同吗?我们为支持包付费,但他们通常不会帮助解决特定的编码问题。
【解决方案2】:

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

env_variables:
   GAE_USE_SOCKETS_HTTPLIB : 'anyvalue'

这并没有消除 InsecurePlatformWarning,我的特定请求似乎不受任何导致此警告的影响。

【讨论】:

    【解决方案3】:

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

    libraries:
    - name: ssl
      version: latest
    

    虽然有些人可能仍然像我一样拥有version: 2.7

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多