這是最近版本的OpenSSL和某些Web服務器之間不兼容的體現。蘋果公司正盡最大努力消除OS X上的OpenSSL,所以他們只使用安全補丁(作爲操作系統的一部分,OpenSSL一直難以支持,更不用說引入像這樣的問題的「次要」更新),而Debian正在使用一個更新的OpenSSL 1.0.1。
@Brian Redbeard的建議檢查openssl
命令行是一個很好的建議 - 它掛在我wwws.mint.com
當我剛剛嘗試它。
This question在ServerFault上終於提供了答案。鏈接到那裏的SSLLabs測試將確定long handshake intolerance作爲影響OpenSSL 1.0.1和更高版本的問題,並指向具有一些潛在解決方法的OpenSSL bug。
或者使用-no_tls1_2
,爲OpenSSL的開發商一個建議,或減少與-cipher
參數的密碼列表,使OpenSSL的1.0.1與wwws.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
;通過將其更改爲PROTOCOL_SSLv3
它成功連接。
您可以使用諸如ssl.OPENSSL_VERSION_INFO[:3] >= (1, 0, 1)
的測試來防範此修補程序。
如果尚未發佈,可能會將其報告爲Debian OpenSSL錯誤。
我認爲這與機械化本身無關,它與python stdlib有關 - 請參閱[這個問題](http://bugs.python.org/issue1251)。 – alecxe
@alecxe非常感謝,這似乎確實適用。然而,根據該線程,這個問題應該修補......這顯然不是。任何想法我能做些什麼來讓事情發揮作用?另外,如果這個錯誤導致了這個問題,那麼這對OSX也不是問題,因爲它們都是Python 2.7.3? – rickcnagy
好吧,這很難說。該代碼適用於我在Ubuntu 12.04上使用python 2.7.3。 – alecxe