我发现了一些处理这个问题的方法:
要修复 IIS 中的服务器端,请下载并安装https://www.nartac.com/Products/IISCrypto/Default.aspx并单击 BEAST 按钮,或通过禁用其他协议强制使用 SSL3.0。
如果您无权访问 IIS 服务器,可以通过将 Python 回滚到版本 2.7.2 或更早版本来修复它。
如果你喜欢冒险,你可以修改sslutil.py中的mercurial源,在顶部附近,更改行
sslsocket = ssl.wrap_socket(sock, keyfile, certfile,
cert_reqs=cert_reqs, ca_certs=ca_certs)
to
from _ssl import PROTOCOL_SSLv3
sslsocket = ssl.wrap_socket(sock, keyfile, certfile,
cert_reqs=cert_reqs, ca_certs=ca_certs, ssl_version=PROTOCOL_SSLv3)
这将解决该问题并修复 IIS 后面的 Mercurial 的推送限制。
如果您对为什么 Python 2.7.3 破坏了这个感兴趣,请查看http://bugs.python.org/issue13885以获得解释(与安全相关)。如果你想修改 Python 本身,请在 Modules/_ssl.c 中更改该行
SSL_CTX_set_options(self->ctx,
SSL_OP_ALL & ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS);
回到 2.7.3 之前的情况:
SSL_CTX_set_options(self->ctx, SSL_OP_ALL);
编译并重新安装 python 等。如果我正确理解 OpenSSL 文档,这会增加更多的 SSL 兼容性,但会带来潜在的安全风险。