我使用:Python 2.7.15,OpenSSL 1.1.0h(2018年3月27日),MS Exchange 2007。
我的MS交换仅允许在STARTTLS之后发送登录名/密码。
在python中,我尝试连接到服务器,例如:
from stmplib import SMTP
conn = SMTP(server,port)
conn.set_debuglevel(1)
conn.starttls()
conn.login(username, password)
conn.quit()
最后我在starttls
中遇到错误:
/python2.7/ssl.py”,行847,在do_handshake中 self._sslobj.do_handshake()
问题是跟随python尝试与TLS v1.2建立连接,但Exchange仅支持TLS v.1.0。我尝试使用端口25和587。
当我尝试通过控制台openssl
应用程序连接并登录服务器时,对于使用TLS v.1.0的两个端口都可以正常工作:
openssl s_client -connect sever:587 -starttls smtp -no_tls1_2 -no_tls1_1 -crlf
服务器答案:
SSL handshake has read 1481 bytes and written 530 bytes
--- New, TLSv1/SSLv3, Cipher is RC4-MD5 Server public key is 2048 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE No ALPN negotiated SSL-Session:
Protocol : TLSv1
Cipher : RC4-MD5
Session-ID: xxxx
Session-ID-ctx:
Master-Key: xxxx
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1533874470
Timeout : 300 (sec)
Verify return code: 21 (unable to verify the first certificate)
--- 250 CHUNKING ehlo 250-xxxxxxx Hello [xxxx] 250-SIZE 26214400 250-PIPELINING 250-DSN 250-ENHANCEDSTATUSCODES 250-AUTH GSSAPI NTLM LOGIN 250-8BITMIME 250-BINARYMIME 250 CHUNKING ^C
我尝试继承标准的SMTP类以重载starttls
方法,以使用context
选项,例如:
# show only changes to standard `starttls` method
def starttls(self, keyfile=None, certfile=None, context=None):
...
if context is None:
context = ssl._create_stdlib_context(certfile=certfile, keyfile=keyfile)
self.sock = context.wrap_socket(self.sock, server_hostname=self._hostname)
...
并在我的脚本中使用此类:
context = ssl.SSLContext(ssl.PROTOCOL_TLS)
context.options |= ssl.OP_NO_TLSv1_2 | ssl.OP_NO_TLSv1_1
conn = mySMTP(server,port)
conn.set_debuglevel(1)
conn.starttls(context = context)
conn.login(username, password)
conn.quit()
但是错误仍然相同。
我做错了什么?可能是上下文选项必须是其他选项,还是我可能想念某些东西?
在这种情况下,如何设置smtplib和starttls方法以强制仅使用TLS v.1.0?
答案 0 :(得分:1)
使用不推荐使用的SSL版本连接到旧电子邮件源时,过去对我成功的事情是使用stunnel或类似方法设置本地隧道并通过localhost连接到本地主机,您也可以设置本地sendmail实例作为代理。