我想在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包的問題。
您是如何安裝(並構建相關的)Python 2.7和3.4的?是否有可能使用舊的SSL庫構建? – abarnert 2014-12-06 02:42:31
兩者都是通過apt-get在Ubuntu 14.04 LTS上安裝OpenSSL版本1.0.1f。 – kavdev 2014-12-06 03:59:26