繁体   English   中英

Python 3.4-仅使用TLSv1连接到imap服务器

[英]Python 3.4 - Connect to imap server using only TLSv1

我正在尝试仅使用Python 3.4中的TLSv1连接到imap邮件服务器。

经过大量故障排除(大多数故障排除后确定邮件服务器仅支持TLSv1)之后,我发现可以使用openssl连接到服务器:

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

以及Python 2.7中的sockets包:

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,即使我告诉我不要这么做。

有谁知道为什么会这样以及我如何解决呢?

PS-我将在将与服务器接口的代码中使用imaplib。 在此示例中,我使用了套接字来突出显示这似乎不仅仅是imaplib软件包的问题。

...大多数决定邮件服务器仅支持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,实际上使用SSLv3函数可以完成许多TLS处理。 因此,此错误消息可能令人困惑。

当使用某种工具将服务器检出时,它看起来像

  • 将使用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")或类似wrap_socket( ... , ciphers="RC4-MD5")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM