Python与SSL -- 协议违规导致EOF出现

5 投票
1 回答
4718 浏览
提问于 2025-04-17 23:31

我正在尝试通过Python登录一个网站。我有以下代码:

import sys
sys.path.append('ClientCookie-1.3.0')
import ClientCookie
sys.path.append('ClientForm-0.2.10')
import ClientForm

cookieJar = ClientCookie.CookieJar()

opener = ClientCookie.build_opener(ClientCookie.HTTPCookieProcessor(cookieJar))
opener.addheaders = [("User-agent","Mozilla/5.0 (compatible)")]
ClientCookie.install_opener(opener)
fp = ClientCookie.urlopen("login_page_url")
forms = ClientForm.ParseResponse(fp)
fp.close()

# print forms on this page
for form in forms: 
    print("***************************")
    print(form)

form = forms[2]
form["username"] = "some_username"
form["password"] = "some_password"
fp = ClientCookie.urlopen(form.click())
fp.close()
fp = ClientCookie.urlopen("some_url_for_authorized_users_only")
html = fp.read()
fp.close();
print(html.decode('utf-8'))

输出结果

URLError: <urlopen error [Errno 8] _ssl.c:507: EOF occurred in violation of protocol>

我哪里做错了?这是什么意思?我该如何修复这个错误?

1 个回答

3

看起来你遇到的问题是因为你使用的OpenSSL版本太旧了。

你可以通过下面的命令来检查版本:

 $ openssl version -a

还有这个:

 $ python -c "import ssl; print ssl.OPENSSL_VERSION"

这两个结果可能不一致。第一个命令显示的是你系统正在使用的版本。如果第二个命令显示的是一个不同的(可能是更旧的)版本,那就说明你的Python没有指向你安装的最新OpenSSL版本。

在我的情况下,第一个结果是0.9~,所以我通过homebrew把OpenSSL升级到了1.0.2k。然后我重新安装了Python,以确保它使用的是更新的版本。

如果你在使用Mac,这个链接是一个很好的参考,可以帮助你升级SSL。此外,你可能还需要参考这个链接,因为较新的OS X系统有更强的安全性,你需要解锁它。

撰写回答