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 的组合。