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

Python 3.4-仅使用TLSv1连接到imap服务器,python,sockets,python-3.x,ssl,imaplib,Python,Sockets,Python 3.x,Ssl,Imaplib,我正在尝试仅使用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",

我正在尝试仅使用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 2.7.6(默认,2014年3月22日,22:59:56)
[GCC 4.8.2]关于linux2
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>导入ssl
>>>导入套接字
>>>
>>>sock=socket.socket(socket.AF\u INET,socket.sock\u流)
>>>ssl\u sock=ssl.wrap\u socket(sock=sock,ssl\u version=ssl.PROTOCOL\u TLSv1)
>>>ssl_sock.connect(('mail.calpoly.edu',993))
>>>ssl_袜子
但是,当我尝试在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.0(默认,2014年4月11日,13:05:11)
[GCC 4.8.2]在linux上
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>导入ssl
>>>导入套接字
>>> 
>>>sock=socket.socket(socket.AF\u INET,socket.sock\u流)
>>>ssl\u sock=ssl.wrap\u socket(sock=sock,ssl\u version=ssl.PROTOCOL\u TLSv1)
>>>ssl_sock.connect(('mail.calpoly.edu',993))
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib/python3.4/ssl.py”,第841行,在connect中
self.\u real\u connect(地址,错误)
文件“/usr/lib/python3.4/ssl.py”,第832行,在real\u connect中
self.do_握手
文件“/usr/lib/python3.4/ssl.py”,第805行,在do_握手中
赛尔夫:握手
ssl.SSLError:[ssl:SSLV3\u警报\u握手失败]SSLV3警报握手失败(\u ssl.c:598)
看起来Python 3.4试图使用sslv3,尽管我告诉它不要这样做

有人知道为什么会发生这种情况,以及我如何解决它吗

另外,我将在与服务器接口的代码中使用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,许多TLS处理实际上是通过SSLv3函数完成的。因此,此错误消息可能令人困惑

当用它签出服务器时,看起来

  • 将使用SSL3.0返回“不受支持的协议”,这很好
  • 将使用TLS1.1而不是仅使用TLS1.0返回。这意味着服务器或中间的某个中间盒严重损坏
  • 将只接受RC4-MD5作为密码,并在任何其他密码上发出嘎嘎声。这也使得它被破坏,因为它应该在不受支持的密码上返回“无共享密码”
RC4-MD5也是不使用python 3.4的原因。与Python2.7相反,Python3.4中有一个更安全的默认密码集,其中包括“.:!MD5”。这意味着Python3.4客户端将不提供RC4-MD5作为密码,因此握手将失败,因为没有共享密码

修复将是修复损坏的服务器。解决方法可能是为您的连接显式设置密码,即
wrap_socket(…,ciphers=“RC4-MD5”)
或类似方法

…其中大部分确定邮件服务器仅支持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函数完成的。因此,此错误消息可能令人困惑

当用它签出服务器时,看起来

  • 将使用SSL3.0返回“不受支持的协议”,这很好
  • 将使用TLS1.1而不是仅使用TLS1.0返回。这意味着服务器或中间的某个中间盒严重损坏
  • 将只接受RC4-MD5作为密码,并在任何其他密码上发出嘎嘎声。这也使得它被破坏,因为它应该在不受支持的密码上返回“无共享密码”
RC4-MD5也是不使用python 3.4的原因。与Python2.7相反,Python3.4中有一个更安全的默认密码集,其中包括“.:!MD5”。这意味着Python3.4客户端将不提供RC4-MD5作为密码,因此握手将失败,因为没有共享密码

修复将是修复损坏的服务器。解决方法可能是为您的连接显式设置密码,即
wrap_socket(…,ciphers=“RC4-MD5”)
或类似方法

…其中大部分确定邮件服务器仅支持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函数完成的。因此,此错误消息可能令人困惑

当用它签出服务器时,看起来

  • 将使用SSL3.0返回“不受支持的协议”,这很好
  • 将使用TLS1.1而不是仅使用TLS1.0返回。这意味着服务器或中间的某个中间盒严重损坏
  • 将只接受RC4-MD5作为密码,并在任何其他密码上发出嘎嘎声。这也使它破碎了