如果客户端期望它,python启用ssl

时间:2013-02-02 21:08:12

标签: python sockets ssl serversocket

如果有任何方法可以知道客户端是否希望服务器启用SSL?

我正在构建一个小型SMTP服务器,并且已经在465上实现了SSL,但是有些客户端不期望SSL,因此显然连接失败。

有可能以任何方式说明这一点吗?

1 个答案:

答案 0 :(得分:1)

服务器没有干净的方法来检测客户端是否希望在连接开始时使用SSL / TLS。实际上,如果预期服务器首先发送数据(如SMTP的情况:服务器在客户端发送任何数据之前发送横幅),则根本无法做到这一点。

这就是为什么SSL / TLS通常以下列两种方式之一使用的原因:

  • 为协议的SSL / TLS版本指定新的端口号。例如,HTTP(端口443而不是端口80),IMAP(端口993而不是端口143),SMTP(端口465而不是25或587)。如果服务器接受新端口上的连接,则知道立即使用SSL / TLS。
  • STARTTLS:服务器和客户端首先讨论协议的非SSL / TLS版本,但服务器在其服务功能公告中指示STARTTLS。客户接受要约并提出要求。服务器和客户端现在都使用SSL / TLS重新启动协议。

STARTTLS的效率稍差,因为服务器和客户端之间的非SSL / TLS会话首先发生(使用多次网络往返)并且不能与所有协议一起使用(HTTP不支持它) ),但它通常是首选,因为它可以更容易地自动配置电子邮件设置(不需要探测一堆可能的端口,并选择最好的端口)。

端口465是第一个解决方案的示例:选择一个新端口并在其上运行SSL / TLS。这意味着服务器和客户端都应该立即使用SSL / TLS进行该端口上的通信。

如果您看到客户端尝试在端口465上使用纯文本SMTP,这些客户端已经破解。你真的没有办法解决它们。客户有严重的错误,应该修复...

此外,对于SMTP,you really need to be using STARTTLS, not SMTP over SSL/TLS on port 465