urlfetch.UrlfetchException:_ssl.c:510:EOF违反协议

时间:2017-05-18 03:09:30

标签: python-2.7 google-app-engine sni

我在ubuntu上使用python 2.7.6

当我使用urlfetch (1.0.2)将数据发布到远程服务器时,我收到此错误。它在服务器的ssl证书更新后2天前启动。

已经向另一个python包{ fileOne: {title: blah, text: blah}, fileTwo... }报告了类似的问题。解决方案是通过运行

来更新一些依赖项
snapshot.val()

但我只有这个

request

似乎没有下载和安装任何内容。

有些帖子暗示它与密码(https://github.com/kennethreitz/requests/issues/3608#issuecomment-250681069

有关
pip install --force-reinstall requests[security]

看起来很正常吗?我能做些什么来解决它吗?

目标服务器位于Google App Engine上。新的SSL证书不支持Requirement already satisfied: requests[security] in /usr/lib/python2.7/dist-packages requests 2.2.1 does not provide the extra 'security'

Ubuntu版本信息:

openssl s_client -connect www.example.com:443 
CONNECTED(00000003)
140353237063328:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:177:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 305 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---

2 个答案:

答案 0 :(得分:2)

我的第一选择是使用this answer通过修补ssl.py来解决问题。

import ssl
from functools import wraps
def sslwrap(func):
    @wraps(func)
    def bar(*args, **kw):
        kw['ssl_version'] = ssl.PROTOCOL_TLSv1
        return func(*args, **kw)
    return bar

ssl.wrap_socket = sslwrap(ssl.wrap_socket)

然而它没有用。

最后我发现我可以通过从源代码将python升级到2.7.13来解决它。以下是步骤:

1)安装python dev依赖

sudo apt-get install -y \
autotools-dev      \
blt-dev            \
bzip2              \
dpkg-dev           \
g++-multilib       \
gcc-multilib       \
libbluetooth-dev   \
libbz2-dev         \
libexpat1-dev      \
libffi-dev         \
libffi6            \
libffi6-dbg        \
libgdbm-dev        \
libgpm2            \
libncursesw5-dev   \
libreadline-dev    \
libsqlite3-dev     \
libssl-dev         \
libtinfo-dev       \
mime-support       \
net-tools          \
netbase            \
python-crypto      \
python-mox3        \
python-pil         \
python-ply         \
quilt              \
tk-dev             \
zlib1g-dev

2)下载源代码

wget https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tgz

3)打开包装

tar xfz Python-2.7.13.tgz

4)配置

cd Python-2.7.13/
./configure --prefix /usr/local/lib/python2.7.13 --enable-ipv6

5)构建

make

6)部署

sudo make install

7)安装pipurlfetch以及其他依赖项

答案 1 :(得分:2)

旧版本的Python上会出现此错误,该版本不支持TLS SNI(服务器名称指示)扩展。您需要使用SNI通过HTTPS连接到App Engine上托管的站点。看起来Python 2.7.9及更高版本中存在SNI支持。

如果您正在使用从用Python编写的App Engine应用程序发出请求并需要SNI支持,则需要reference version 2.7.11 of the ssl library in your app.yaml file或者您将遇到同样的问题。