【问题标题】:When connecting to SMTP servers should I try SSL or TCP/STARTTLS first?连接到 SMTP 服务器时,我应该先尝试 SSL 还是 TCP/STARTTLS?
【发布时间】:2012-11-04 18:07:25
【问题描述】:

SMTP 允许通过端口 25 进行未加密通信。对于某些服务器(例如 Google 的 MX 服务器),我可以在建立初始未加密连接后使用 STARTTLS 切换到 TLS 连接。

S:220 mx.google.com ESMTP l1si352658een.133
C:EHLO mail.example.com
S:250-mx.google.com at your service
S:250-SIZE 35882577
S:250-8BITMIME
S:250-STARTTLS
S:250-ENHANCEDSTATUSCODES
S:250 PIPELINING
C:STARTTLS
S:220 2.0.0 Ready to start TLS
[socket switches to TLS here]
C:EHLO mail.example.com
...

但是,我也想支持直接 SSL 连接,我想知道大多数邮件服务器是更喜欢从 SSL 开始还是从 TCP 开始,然后在建立连接后移动到 TLS。

【问题讨论】:

    标签: email ssl smtp starttls


    【解决方案1】:

    除非您与服务器管理员事先安排好,否则不要尝试使用 SSL 进行连接。端口 (465) 用于 SSMTP 或 SMTPS(基于 SSL 的 SMTP)。与此端口的连接预计会使用 SSL 启动连接。由于 StartTLS 可用,已放弃使用此端口和协议。

    有两个端口可以支持带有 StartTLS 的 SMTP。在没有 StartTLS 的情况下,两者都不支持 SSL,如果您尝试,可能会断开连接。 SMTP (25) 和 Submission (587) 都可以支持 StartTLS。如果它被支持,它将被列在对 EHLO 消息的响应中。然后,您可以启动 StartTLS 过程。详情请见RFC 3207

    从您的 cmets 看来,您真正关心的是如何验证证书。这是一个不同但相关的问题。它还假设邮件服务器没有使用自签名证书。就我而言,我使用自签名证书。这对我很有效,因为 StartTLS 很少(如果有的话)用于 SMTP(端口 25)连接。我可以合理控制连接消息提交(端口 587 或端口 25)的客户端,这些客户端必须在发送消息之前进行身份验证。根据我的经验,StartTLS 主要用于保护必须在发送电子邮件之前进行身份验证的客户端的连接。

    【讨论】:

      【解决方案2】:

      对 SSL/TLS on connect (SMTPS) 或 STARTTLS 之后的 SSL/TLS 的支持确实因一台服务器而异,具体取决于软件及其配置方式。

      连接时 SSL/TLS 的主要优点是它不需要对应用程序协议进行任何更改。事实上,您可以在每一侧使用 stunnel 之类的东西来包装连接。

      STARTTLS 之后的 SSL/TLS 的主要优点是可以在同一个端口上完成。另一个优势可能是能够托管多个主机名(取代 TLS 级别的服务器名称指示),但我不确定这是否曾用于 SMTP 服务器。

      STMPS(连接时的 SSL/TLS)没有官方规范,使用 port number for which it is not registered (465)。从理论上讲,它也已被弃用。然而,许多服务器可以支持它(例如Exim),并且如果它们能够做到,它们将能够同时支持:这将取决于托管服务来选择配置什么。

      如果您正在编写一个客户端并且已经支持STARTTLS,那么在连接时支持 SSL/TLS 也应该相当便宜。支持两者当然是一个好主意,因为它可以被更多的用户使用(如果我没记错的话,Gmail 在某些时候只支持 SMTPS,它在防火墙阻止的情况下也很有用仅端口之一)。

      只要以一种或另一种方式使用 SSL/TLS(并且执行正确的证书验证,包括主机名),两者都可以提供相似级别的安全性。

      对于the difference between SSL and TLS,通常存在一些混淆。出于某种原因,似乎许多电子邮件软件实现未能意识到“STARTTLS”中最重要的词是“START”,而不是 TLS(在连接模式和协议选择方面)。不幸的是,这种混淆已传播到某些软件配置选项(甚至在流行的邮件客户端中),因此也传播到了 ISP 文档中。预计您的用户会感到困惑。

      无论您想支持哪种模式,请确保它没有 "Use TLS, if available" option,如果 SSL/TLS 不可用,它将退回到普通交换:这会打开与 MITM 攻击的连接。

      【讨论】:

      • 很好的总结,我目前正在尝试使用 PHP 到 verify a certificate,但与 SSL 不同,我不确定如何在 切换到 TLS 后验证证书开始TLS。我似乎无法让 SSL 与 Google 或 Hotmail 的 MX 服务器(端口 25、465 或 587)一起使用,但 Google 支持 STARTTLS,所以我猜它们已经从 SMTPS 改变了。
      • "[...] 但与 SSL [...]" 不同:在这里,您在 SSL 和 TLS 之间做出了同样的错误区分。 SSL 或 TLS 的证书验证过程将是相同的,但在连接时使用 STARTTLS 或使用 SSL/TLS 确实可能有所不同。关于 PHP,它的默认证书验证行为通常很差(记得验证证书和主机名,顺便说一句)。也许 curl 绑定可能支持 SMTP(S)。
      • “证书验证过程对于 SSL 或 TLS 是相同的,但在连接时使用 STARTTLS 或使用 SSL/TLS 确实可能有所不同。” 这就是我的想法说。在 PHP 中验证 SSL 连接上的证书相当容易,“但与 SSL 不同,我不确定在 STARTTLS 中 [从 tcp] 切换到 TLS 后如何验证证书。
      • 我的意思是关于你所说的“SSL”和“TLS”。您反对 SSL 与 TLS(“不像 SSL”),暗示“SSL”仅适用于 SMTPS,而“TLS”仅适用于 SMTP+STARTTLS。如今,您实际上很可能能够同时使用 TLS。
      • 好吧,我并不是在反对,只是在尝试将 直接 SSL/TLS 连接与未加密的切换连接联系起来时遇到了问题> 到 TLS 中途。我不确定在进行切换时如何验证证书。
      猜你喜欢
      • 2023-03-03
      • 2021-06-22
      • 2011-07-13
      • 2021-01-04
      • 2021-03-08
      • 1970-01-01
      • 2015-05-28
      • 2013-08-21
      • 1970-01-01
      相关资源
      最近更新 更多