2014-12-06 37 views
0

我想在Python 3.4中僅使用TLSv1連接到imap郵件服務器。Python 3.4 - 僅使用TLSv1連接到imap服務器

很多故障排除(其中大部分確定郵件服務器只支持使用TLSv1)後,我發現,我可以使用OpenSSL的連接到服務器:

openssl s_client -connect mail.calpoly.edu:993 -tls1 

與插座包以及Python 2.7版:

Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import ssl 
>>> import socket 
>>> 
>>> sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
>>> ssl_sock = ssl.wrap_socket(sock=sock, ssl_version=ssl.PROTOCOL_TLSv1) 
>>> ssl_sock.connect(('mail.calpoly.edu', 993)) 
>>> ssl_sock 
<ssl.SSLSocket object at 0x7fbab6e7aed8> 

當我嘗試在Python 3.4連接,但是,我得到一個握手錯誤:

Python 3.4.0 (default, Apr 11 2014, 13:05:11) 
[GCC 4.8.2] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import ssl 
>>> import socket 
>>> 
>>> sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
>>> ssl_sock = ssl.wrap_socket(sock=sock, ssl_version=ssl.PROTOCOL_TLSv1) 
>>> ssl_sock.connect(('mail.calpoly.edu', 993)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python3.4/ssl.py", line 841, in connect 
    self._real_connect(addr, False) 
    File "/usr/lib/python3.4/ssl.py", line 832, in _real_connect 
    self.do_handshake() 
    File "/usr/lib/python3.4/ssl.py", line 805, in do_handshake 
    self._sslobj.do_handshake() 
ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:598) 

似乎Python 3.4嘗試使用sslv3,即使我不告訴它。

有誰知道爲什麼會發生這種情況,我該如何解決它?

P.S. - 我將在將與服務器連接的代碼中使用imaplib。在這個例子中,我使用套接字來強調這似乎不僅僅是imaplib包的問題。

+0

您是如何安裝(並構建相關的)Python 2.7和3.4的?是否有可能使用舊的SSL庫構建? – abarnert 2014-12-06 02:42:31

+0

兩者都是通過apt-get在Ubuntu 14.04 LTS上安裝OpenSSL版本1.0.1f。 – kavdev 2014-12-06 03:59:26

回答

2

...most of which determined that the mail server only supports TLSv1

這是否意味着服務器會抨擊其他任何握手?通常,客戶端將以最佳協議開始(如TLSv12),如果服務器不支持它,則它只會回覆一個較低的協議(如本例中的TLSv1)。但是,有些服務器剛剛壞掉,或者中間有一箇中間的盒子。

[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure 
.... 
It seems like Python 3.4 tries to use sslv3 even though I tell it not to. 

不一定。 TLS1.0只是SSL3.1,許多TLS處理實際上是通過SSLv3功能完成的。所以這個錯誤信息可能會讓人困惑。

當檢查服務器出與some tool看起來,它

  • 將返回「不支持協議」與SSL3.0,這是罰款。
  • 會用TLS1.1呱呱叫,而不是用TLS1.0返回。這意味着中間的服務器或中間件被嚴重破壞。
  • 將只接受RC4-MD5作爲密碼並抨擊其他密碼。這也會導致它被破壞,因爲它應該在不支持的密碼上返回「不共享密碼」。

RC4-MD5也是不使用python 3.4的原因。與python 2.7相反,Python 3.4中包含「..:!MD5」更安全的默認密碼。這意味着python 3.4客戶端不會提供RC4-MD5作爲密碼,因此握手將失敗,因爲沒有共享密碼。

修復將修復破損的服務器。解決方法可能是爲您的連接明確設置密碼,即wrap_socket(... , ciphers="RC4-MD5")或類似

+0

非常感謝你 - 明確聲明密碼工作!我甚至沒有想過要檢查服務器的密碼套件。 – kavdev 2014-12-06 06:20:56