我可以使用 Python 2.7.3 复制您的 Debian Wheezy 问题,该版本使用与您报告的完全相同的 OpenSSL 版本。我使用 Wireshark 捕获数据包,并且 TLS 握手成功并且交换了一些数据。然而不久之后,客户端对服务器发送的内容不满意并关闭连接。
我通过使用 SSL3 而不是 TLS 解决了这个问题。我不知道如何修补 Python 中的库方法,以便使用它的其他库会有不同的行为,所以我只是制作了自己的本地副本smtplib
.
我复制了2.7版本smtplib(点击raw link下载)并更改了一行:
self.sock = ssl.wrap_socket(self.sock, keyfile, certfile)
to
self.sock = ssl.wrap_socket(self.sock, keyfile, certfile, ssl_version=ssl.PROTOCOL_SSLv3)
然后,通过本地目录中编辑后的文件,我得到:
Python 2.7.3 (default, Jan 2 2013, 13:56:14)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import smtplib
>>> s = smtplib.SMTP()
>>> s.connect('smtp.live.com:587')
(220, 'BLU0-SMTP418.blu0.hotmail.com Microsoft ESMTP MAIL Service, Version: 6.0.3790.4675 ready at Wed, 3 Jul 2013 09:59:32 -0700')
>>> s.ehlo()
(250, 'BLU0-SMTP418.blu0.hotmail.com Hello [24.143.227.254]\nTURN\nSIZE 41943040\nETRN\nPIPELINING\nDSN\nENHANCEDSTATUSCODES\n8bitmime\nBINARYMIME\nCHUNKING\nVRFY\nTLS\nSTARTTLS\nOK')
>>> s.starttls()
(220, '2.0.0 SMTP server ready')
>>> s.ehlo()
(250, 'BLU0-SMTP418.blu0.hotmail.com Hello [24.143.227.254]\nTURN\nSIZE 41943040\nETRN\nPIPELINING\nDSN\nENHANCEDSTATUSCODES\n8bitmime\nBINARYMIME\nCHUNKING\nVRFY\nAUTH LOGIN PLAIN\nOK')
>>> s.login('[email protected]','MyPaSsW0rD')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "smtplib.py", line 615, in login
raise SMTPAuthenticationError(code, resp)
smtplib.SMTPAuthenticationError: (535, '5.0.0 Authentication Failed')
>>>
我没有有效的 Hotmail 帐户,因此无法通过此处,但不再出现 SSL 错误。