我正在实施一个安全地与客户端通信的IMAP代理。但是,握手时我遇到了问题。
我的代理的代码是:
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.bind((host, port))
ssock, addr = self.sock.accept()
context = ssl.SSLContext(ssl.PROTOCOL_TLS)
self.conn_client = context.wrap_socket(ssock)
我收到错误:
ssl.SSLError: [SSL: UNEXPECTED_MESSAGE] unexpected message (_ssl.c:833)
我的测试代码是:
M = imaplib.IMAP4_SSL(IP_PROXY)
我收到错误:
ssl.SSLError: [SSL: UNKNOWN_PROTOCOL] unknown protocol (_ssl.c:777)
但是,代理的代码是:
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.bind((host, port))
ssock, addr = self.sock.accept()
self.conn_client = ssl.wrap_socket(ssock, certfile=CERT, server_side= True)
它正常工作,但我不想使用证书。
谢谢
答案 0 :(得分:1)
它正常工作,但我不想使用证书。
SSL / TLS几乎随处可用于证书,以确保客户端与预期的服务器通信,而不是与中间的某个人通信。如果您不想使用证书,则需要使用不同类型的身份验证(如PSK)或根本不使用身份验证(“匿名身份验证” - 非常糟糕的主意)。
无论如何,您都需要设置相关密码以在客户端和服务器上启用此备用身份验证。这可以通过服务器端的ciphers
属性wrap_socket
完成,在客户端代码中可以通过构造带有必要密码的SSLContext并使用ssl_context
参数来完成特定于IMAP4_SSL
中使用的上下文。
但这仅适用于您特定的基于Python的IMAP客户端。不要指望您能够将常用的IMAP客户端(如Thunderbird或Outlook)配置为可用于没有证书的服务器。就像我说的那样,这首先是一个坏主意。