在客户端期望的情况下启用Python的SSL

1 投票
1 回答
584 浏览
提问于 2025-04-17 14:34

有没有办法知道客户端是否希望服务器开启SSL?

我正在搭建一个小型的SMTP服务器,并且在465端口上实现了SSL加密,但有些客户端并不期待使用SSL,所以连接自然就失败了。

有没有什么方法可以判断这一点呢?

1 个回答

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,这些客户端是有问题的。你真的无能为力去解决这个问题。这些客户端存在严重的bug,需要修复……

而且,对于SMTP来说,你真的应该使用STARTTLS,而不是在465端口上使用SSL/TLS的SMTP

撰写回答