SMTP Indy组件的安全性和身份验证属性是什么?

6

我正在使用Indy组件来实现Delphi应用程序中的电子邮件功能。我具体使用TidSMTP组件。我需要有效地支持所有主要的邮件服务器。我使用Mozilla Thunderbird作为我的电子邮件客户端,并将smtp属性与TidSMTP组件中的属性进行比较。我试图找到描述TidSMTP属性之间关系的文档,但还没有能够弄清楚。

有人可以解释一下以下内容的比较和作用吗:

  • 在Thunderbird中:连接安全性:(无、STARTTLS、SSL/TLS)。
  • 在TidSMTP.UseTLS(utNoTLSSupport、utUseImplicitTLS、utUseRequireTLS、utUseExplicitTLS)

  • 在Thunderbird中:认证方法:(无认证、普通密码、加密密码、Kerberos/GSSAPI、NTLM)

  • 在TidSMTP中(用户名、密码、使用认证方法)

我也看到其他TidSMTP属性:UseEhlo、UseVerp、UseNagle。我需要使用它们吗?它们的作用是什么?

1个回答

18

使用 STARTTLS 时,连接服务器的监听端口最初是未加密的。当客户端连接时,如果服务器支持它,它可以发送一个可选的 STARTTLS 命令到服务器,在那时动态执行 SSL/TLS 握手。这允许传统的非 SSL/TLS 客户端继续连接到同一端口,同时允许新的 SSL/TLS 启用的客户端在服务器上使用 SSL/TLS(如果有)。这相当于 Indy 中的 UseTLS=utUseExplicitTLS。为了使用 UseTLS=utUseExplicitTLS,您需要将 UseEHLO 设置为 True,因为 EHLO 命令是 TIdSMTP 用来发现服务器是否支持 STARTTLS 命令的。

当使用 SSL/TLS 而不是 STARTTLS 时,服务器的监听端口始终使用加密,客户端必须立即在连接后启动 SSL/TLS 握手,然后才能交换任何其他数据。这相当于 Indy 中的 UseTLS=utUseImplicitTLS。没有使用 STARTTLS 命令。

对于身份验证,TIdSMTP 有两个选项 - 老的(且不安全的)AUTH LOGIN 命令,它由原始 SMTP 规范定义,以及基于 SASL 的散列/加密算法的 SMTP 扩展(Kerberos、GSSAPI、NTLM等均实现为 SASL 算法)。

要使用SASL,将TIdSMTP.AuthType设置为satSASL,然后填写TIdSMTP.SASLMechanisms集合,指向单独的TIdSASL派生组件,用于支持您在应用程序中想要支持的算法。Indy自带DIGEST-MD5CRAM-MD5CRAM-SHA1NTLM(实验性)、ANONYMOUSEXTERNALOTPPLAINSKEYLOGIN的本机SASL组件(AUTH LOGIN的SASL包装器)。如果需要其他算法(例如Kerberos或GSSAPI),则必须编写自己的TIdSASL派生组件。对于使用用户名/密码的算法,必须将值分配给一个单独的TIdUserPassProvider组件,然后将其分配给SASL组件(TIdSMTP.UserNameTIdSMTP.Password属性不用于SASL)。支持的SASL算法越多,就能够支持的服务器越广泛。
对于仍然支持AUTH LOGIN的服务器,可以通过将TIdSMTP.AuthType设置为satDefault(如果服务器支持AUTH LOGIN但不在响应EHLO命令时报告它,则可以选择将TIdSMTP.ValidateAuthLoginCapability设置为False),然后填写TIdSMTP.UserName和属性,或者在TIdSMTP.SASLMechanisms集合中包含TIdSASLLogin组件来使用。

UseVerpUseNagle与安全无关。 VERP是用于检测由于无法交付的错误而导致的反弹电子邮件的SMTP扩展名。 Nagle是一种用于优化网络数据包的网络算法。


1
@Remy Lebeau 你没有提到 UseTLS=utRequireTLS,那个选项具体是做什么的呢? - Jens Mühlenhoff
2
@JensMühlenhoff:我没有提到它,因为客户端很少使用它,特别是和TIdSMTP一起使用。相反,它更常用于服务器端,以在TLS会话建立之前接收到命令时生成错误。 - Remy Lebeau
1
@RemyLebeau,我们可以使用一个TIdUserPassProvider实例并在所有TIdSASL派生组件之间共享吗?还是每个SASL组件都需要一个单独的实例? - Delphi.Boy
1
@Delphi.Boy,是的,您可以将单个TIdUserPassProvider与多个SASL组件共享。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接