使用Python中的Mechanize打开SSL URL

时间:2012-06-25 21:47:33

标签: python ssl mechanize urllib2

如何使用mechanize在Python中打开SSL URL?

我正在尝试使用Python 2.7.3在Ubuntu上进行简单的页面检索,如:

import mechanize
browser = mechanize.Browser()
resp = browser.open('https://mydomain.com')

但它会引发错误:

urllib2.URLError: <urlopen error [Errno 1] _ssl.c:504: error:140773E8:SSL routines:SSL23_GET_SERVER_HELLO:reason(1000)>

奇怪的是,当我在Fedora上运行Python 2.6.4下的相同代码时,我没有收到此错误...

据推测,这可能不是机械化的直接问题,而是使用urllib2和底层的SSL C库。谷歌搜索显示几个点击。有解决方法吗?

编辑:我找到了这个old bug report,并提供了建议的解决方法(基本上Python正在尝试将SSLv23用于仅限SSLv3的网站),但该代码会导致错误httplib.BadStatusLine: ''

1 个答案:

答案 0 :(得分:-1)

此问题可能是由于在Web服务器上禁用了SSLv2,但Python 2.x尝试默认情况下与PROTOCOL_SSLv23建立连接。这发生在https://github.com/python/cpython/blob/master/Lib/ssl.py#L867

您可以通过覆盖ssl_version关键字参数,在ssl模块中修补ssl.wrap_socket(),而不是复制和编辑Python库模块。以下代码可以按原样使用。在提出任何请求之前,请将其放在程序的开头。

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)