这是 OpenSSL 最新版本与某些 Web 服务器之间不兼容的表现。Apple 正在尽最大努力消除 OS X 上的 OpenSSL,因此他们只应用了安全补丁(OpenSSL 作为操作系统的一部分一直难以支持,更不用说引入此类问题的“次要”更新),而 Debian 正在使用更新的 OpenSSL 1.0.1。
@Brian Redbeard 建议使用openssl
命令行进行检查是一个很好的建议——wwws.mint.com
当我刚尝试它时,它就挂在我身上了。
ServerFault上的这个问题终于给出了答案。那里链接的 SSLLabs 测试将长时间握手不容忍确定为问题,这会影响 OpenSSL 1.0.1 及更高版本,并链接到具有一些潜在解决方法的OpenSSL 错误。
-no_tls1_2
正如一位 OpenSSL 开发人员建议的那样,使用 ,或者使用-cipher
参数减少密码列表,都会导致 OpenSSL 1.0.1 成功地与wwws.mint.com
(以及我试图联系的另一台服务器)握手。
出于我的目的——一个不会被分发的脚本——我做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
; 通过将其更改为PROTOCOL_SSLv3
成功连接。
您可以使用诸如ssl.OPENSSL_VERSION_INFO[:3] >= (1, 0, 1)
.
如果还没有的话,这很可能会被报告为 Debian OpenSSL 错误。