Python ssl登录挂起在Debian上

Python ssl登录挂起在Debian上,python,ssl,debian,mechanize,Python,Ssl,Debian,Mechanize,我正在尝试使用Python 2.7mechanize登录Mint.com,代码如下: import mechanize br = mechanize.Browser() br.open("https://wwws.mint.com/login.event") 这在OSX上运行良好,但在debian上挂起。这个问题似乎与ssl有关;回溯以 File "/usr/lib/python2.7/ssl.py", line 305, in do_handshake self._sslobj.do

我正在尝试使用Python 2.7
mechanize
登录
Mint.com
,代码如下:

import mechanize
br = mechanize.Browser()
br.open("https://wwws.mint.com/login.event")
这在OSX上运行良好,但在debian上挂起。这个问题似乎与ssl有关;回溯以

File "/usr/lib/python2.7/ssl.py", line 305, in do_handshake
    self._sslobj.do_handshake()
编辑:
使用
urllib2
的Debian上仍然存在此问题。正如评论中所建议的,这个问题似乎实际上与ssl有关。为什么Debian而不是OSX会出现问题?

所以Fedora看起来不错:

[bharrington@leviathan ~]$ python
Python 2.7.5 (default, Aug 22 2013, 09:31:58) 
[GCC 4.8.1 20130603 (Red Hat 4.8.1-1)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mechanize
>>> br = mechanize.Browser()
>>> br.open("https://wwws.mint.com/login.event")
<response_seek_wrapper at 0x29b6440 whose wrapped object = <closeable_response at 0x29b6320 whose fp = <socket._fileobject object at 0x298d150>>>
>>> br.title()
'Mint > Start Here'
>>> 
您应该看到mint的SSL证书以及完整的证书链验证,最后一行:“验证返回代码:0(确定)”


虽然我高度怀疑这是一个SSL问题,但我认为它值得检查。此外,请验证mechanize的版本。Debian以使用稳定版本的代码(而不是新版本)而著称。我用mechanize验证的版本是0.2.5

这是OpenSSL最新版本与某些Web服务器之间不兼容的表现。苹果正在尽最大努力消除OSX上的OpenSSL,因此他们只应用了安全补丁(OpenSSL作为操作系统的一部分很难得到支持,更不用说引入类似问题的“次要”更新了),而Debian正在使用更新的OpenSSL 1.0.1

@Brian Redbeard建议使用
openssl
命令行进行检查,这是一个很好的建议——当我刚刚尝试时,它挂在了
wwws.mint.com

在服务器上,Fault最终提供了答案。链接到此处的SSLLabs测试将问题识别为影响OpenSSL 1.0.1及更高版本的问题,并链接到具有一些潜在解决方法的

按照一位OpenSSL开发人员的建议,使用
-no_tls1_2
,或者使用
-cipher
参数减少密码列表,都会导致OpenSSL 1.0.1成功地与
wwwws.mint.com
(以及我试图联系的另一台服务器)握手

出于我的目的-一个不会被分发的脚本-我使用monkeypatched
ssl.wrap_socket
如下所示:

import ssl
old_wrap_socket = ssl.wrap_socket
def wrap_socket(sock, keyfile=None, certfile=None,
                server_side=False, cert_reqs=ssl.CERT_NONE,
                ssl_version=ssl.PROTOCOL_SSLv3, ca_certs=None,
                do_handshake_on_connect=True,
                suppress_ragged_eofs=True, ciphers=None):
    return old_wrap_socket(sock, keyfile, certfile,
                           server_side, cert_reqs, ssl_version,
                           ca_certs, do_handshake_on_connect,
                           suppress_ragged_eofs, ciphers)
ssl.wrap_socket = wrap_socket

import mechanize
ssl_version
的默认值是
ssl.PROTOCOL_SSLv23
;通过将其更改为
协议_SSLv3
,它成功连接

您可以使用诸如
ssl.OPENSSL\u VERSION\u INFO[:3]>=(1,0,1)
之类的测试来保护此修补程序


如果还没有,这可能会被报告为Debian OpenSSL错误。

我认为它与mechanize本身无关,它与python stdlib有关-请参阅。@alecxe非常感谢,这似乎是适用的。然而,根据该线程,这个问题应该得到修补。。。显然不是。你知道我能做些什么让事情顺利进行吗?另外,如果这个bug导致了这个问题,那么OSX上不是也会有问题吗?因为它们都是Python 2.7.3?很难说。这段代码在使用Python2.7.3的Ubuntu12.04上运行。涉及的PythonDebian包的具体版本是什么?
import ssl
old_wrap_socket = ssl.wrap_socket
def wrap_socket(sock, keyfile=None, certfile=None,
                server_side=False, cert_reqs=ssl.CERT_NONE,
                ssl_version=ssl.PROTOCOL_SSLv3, ca_certs=None,
                do_handshake_on_connect=True,
                suppress_ragged_eofs=True, ciphers=None):
    return old_wrap_socket(sock, keyfile, certfile,
                           server_side, cert_reqs, ssl_version,
                           ca_certs, do_handshake_on_connect,
                           suppress_ragged_eofs, ciphers)
ssl.wrap_socket = wrap_socket

import mechanize