1

Ubuntu 12.04 有一个关于 openssl 的开放错误。如果您尝试连接到不支持 TLS 1.2 的主机(例如 Evernote),您会收到“EOF 违反协议”。见https://bugs.launchpad.net/ubuntu/+source/openssl/+bug/965371

在对该错误的评论中,httplib.py 有一个解决方法,其中强制使用 TLS 1.1。不幸的是,这不适用于 GAE SDK,因为它使用自己的基于 urlfetch 的自定义 httplib。

如何强制 urlfetch 使用 TLS 1.1 或以其他方式解决此错误?当我将我的应用程序上传到 GAE 时,它工作正常,所以我只需要对我的 SDK 进行本地修复。我曾尝试用 Python 2.7 中的已修补库存 httplib.py 替换自定义 httplib.py,但这只会导致进一步的问题,因为该模块需要 ssl 和套接字,而后者又需要另一个操作系统等。

编辑:回溯的最后一部分:

  File "evernote-sdk/lib/thrift/transport/THttpClient.py", line 122, in flush
    self.code, self.message, self.headers = self.__http.getreply()
  File "google_appengine/google/appengine/dist27/httplib.py", line 592, in getreply
    response = self._conn.getresponse()
  File "google_appengine/google/appengine/dist27/httplib.py", line 502, in getresponse
    raise HTTPException(str(e))
HTTPException: ApplicationError: 6 [Errno 8] _ssl.c:504: EOF occurred in violation of protocol

问题在于 Ubuntu 12.04、Evernote 的服务器/SDK 和 Google App Engine SDK 的组合。

4

1 回答 1

2

回溯显示错误源自此处: http ://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/dist27/httplib.py#490 此代码块使用 self._fetch在同一文件的第 363 行分配为 urlfetch.fetch。

现在我们现在使用 urlfetch 并且由于问题仅在 dev_appserver 上,让我们看一下 urlfetch_stub.py。存根模块使用 fancy_urllib 库来发出请求。我们也知道 ubuntu 启动板错误建议做一个

< self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file)
---
> self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, ssl_version=ssl.PROTOCOL_TLSv1)

这暗示了我们要修补的电话。在 fancy_urllib 中寻找 'ssl.wrap_socket' 给了我们 1 次命中:init.py#159"> http://code.google.com/p/googleappengine/source/browse/trunk/python/lib/fancy_urllib/fancy_urllib/init .py#159

您可以尝试修补此方法吗?我无法验证,因为我不知道如何重现该问题。

FWIW,在所有 SDK 代码中搜索“ssl.wrap_socket”也指向 httplib2 第三方库中的几行,但现在我认为这不是需要修补的地方。

于 2012-06-15T16:19:19.603 回答