如果客户端期望,Python 启用 SSL



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

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

有没有可能以任何方式告诉这一点?

服务器没有干净的方法来检测客户端是否希望在连接开始时使用 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,您确实需要在端口465上使用STARTTLS,而不是基于SSL/TLS的SMTP。

最新更新