【问题标题】:Getting urllib2.URLError: <urlopen error EOF occurred in violation of protocol (_ssl.c:661)> in mechanize open method获取urllib2.URLError:<urlopen错误EOF发生违反协议(_ssl.c:661)>在机械化打开方法中
【发布时间】:2017-11-24 19:20:47
【问题描述】:

我得到 urllib2.URL错误: 调用 mechanize.browser.open('my https site') 时出错。

我在网上搜索过,但对我没有任何帮助。

这是我的代码:

import ssl
try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # Legacy Python that doesn't verify HTTPS certificates by default
    pass
else:
    # Handle target environment that doesn't support HTTPS verification
    ssl._create_default_https_context = _create_unverified_https_context
import mechanize
import operator
from bs4 import BeautifulSoup
import os
myBrowser = mechanize.Browser()
myBrowser.set_handle_robots(False)
myBrowser.set_handle_refresh(False)
myBrowser.open("https://uwp.puchd.ac.in/common/viewmarks.aspx")

这是我得到的错误:

Traceback (most recent call last):
  File "C:/Users/Himanshu/Desktop/UIET Rank system.py", line 27, in <module>
    myBrowser.open("https://uwp.puchd.ac.in/common/viewmarks.aspx")
  File "C:\Python27\lib\site-packages\mechanize\_mechanize.py", line 254, in open
    return self._mech_open(url_or_request, data, timeout=timeout)
  File "C:\Python27\lib\site-packages\mechanize\_mechanize.py", line 284, in _mech_open
    response = UserAgentBase.open(self, request, data)
  File "C:\Python27\lib\site-packages\mechanize\_opener.py", line 195, in open
    response = urlopen(self, req, data)
  File "C:\Python27\lib\site-packages\mechanize\_urllib2_fork.py", line 352, in _open
    '_open', req)
  File "C:\Python27\lib\site-packages\mechanize\_urllib2_fork.py", line 340, in _call_chain
    result = func(*args)
  File "C:\Python27\lib\site-packages\mechanize\_urllib2_fork.py", line 1215, in https_open
    return self.do_open(conn_factory, req)
  File "C:\Python27\lib\site-packages\mechanize\_urllib2_fork.py", line 1160, in do_open
    raise URLError(err)
urllib2.URLError: <urlopen error EOF occurred in violation of protocol (_ssl.c:661)>

Process finished with exit code 1

其他信息:

import ssl
print ssl.OPENSSL_VERSION

output>> OpenSSL 1.0.2j  26 Sep 2016

python版本

Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:42:59) [MSC v.1500 32 bit (Intel)] on win32 

有没有办法绕过这个错误?

注意:

  • 我只想使用 mechanize,因为我的应用程序已经准备好并且 一年前可以工作,但现在不行了,我不想再更改整个代码。
  • 我在 Windows 上使用 Pycharm。
  • 请尝试打开this webpage which I am trying to open 它在chrome中也显示“不安全的连接”,我们需要继续访问网页。这可能是问题所在。另外,我没有此网页的证书。
  • 我的应用程序与安全性无关,因此将 SSL 验证设置为 false(我尝试从其他帖子中这样做,但它对我不起作用)或类似的东西会非常好。唯一的目标是应用程序应该工作。

【问题讨论】:

    标签: python ssl urllib2 mechanize


    【解决方案1】:

    此站点的问题不是证书验证,因为您已成功将其关闭。相反,问题在于该站点仅支持不再被认为是安全的密码,即基于 3DES 和 RC4 的密码。 出于安全原因,ssl 库中的默认密码不包含这些密码。

    要添加对这些密码的支持,您可以手动设置默认密码集。以下行将DES-CBC3-SHA 设置为提供的密码。这样您就可以访问损坏的网站:

    ssl._DEFAULT_CIPHERS = ('DES-CBC3-SHA')
    myBrowser = mechanize.Browser()
    ...
    

    请注意,您应该只对特定网站使用此设置。虽然理论上也可以为 _DEFAULT_CIPHERS 设置一个更大的密码集来处理所有站点,但这个特定站点存在其他问题:即使 DES-CBC3-SHA 包含在 TLS 握手中,它看起来也会失败提供的密码集,但如果在 DES-CBC3-SHA 之前提供较新的密码(如 GCM)。

    【讨论】:

    • Steffen Ullrich,谢谢您的回复,我尝试了上述声明,但没有成功。您能否提出更多建议以使其发挥作用?
    • @darkPrince:它适用于 Python 2.7.12。但它似乎不适用于 2.7.13 - 我会仔细研究一下。
    • @darkPrince:见编辑 - 现在它也适用于 2.7.13。
    • 它的工作原理就像一个魅力,非常感谢。你能告诉我你是怎么知道这个问题出在密码上的吗?以及它使用了哪些密码?
    • @darkPrince:使用openssl s_client 进行快速检查或使用wireshark 查看捕获的流量将表明它无法在检查证书之前就通用密码达成一致。检查浏览器显示该浏览器使用 3DES。了解similar problems 有助于缩小问题范围。 Experience with SSL problems in general 也很有帮助。
    猜你喜欢
    • 2017-12-18
    • 2012-07-31
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多