请说明 SMTP 加密协议和端口(仅限服务器之间)

Please clarify SMTP encryption protocol and ports (between servers only)

有人可以阐明邮件服务器连接到另一个邮件服务器以传递加密电子邮件的典型方式吗?

我知道 STARTTLS 命令旨在将 tcp 连接升级到 TLS,但我真的希望(作为服务器)在远程端口 25 上执行此操作吗?

我建立了自己的 SMTP 服务器(没有加密,在 perl 中)并托管我所有的电子邮件,但我从未在日志中看到任何远程服务器试图发送 STARTTLS。那么我的服务器是否也应该 运行 在另一个端口上?为什么没有人尝试过 STARTTLS?

最后,如果我希望人们在 Gmail 中看到那个锁定图标,当我连接到 google MX 服务器发送电子邮件时,我所要做的就是在该端口上使用 STARTTLS 启动 TLS 会话25?我是否需要像 SSL 一样由权威机构验证的证书?

谢谢!

... deliver an encrypted email?

首先,传输加密邮件与您询问的STARTTLS的使用是有区别的。加密邮件通常是指使用 PGP 或 S/MIME 进行端到端加密,即发件人加密,收件人解密邮件。相反,STARTTLS 不是端到端的,而只是逐跳加密:途中的每一跳(邮件服务器)都可以访问普通邮件,只有跃点之间的传输是加密的。

... upgrade the tcp connection to TLS, but am I really expected (as a server) to do that on remote port 25?

您应该使用端口 25,因为这是为与 MX 记录相关的交付定义的唯一端口。 STARTTLS的相关标准是RFC 3207。它描述了一个 SMTP 扩展,其中接收邮件服务器可以在对 EHLO 的响应中宣布支持 STARTTLS,然后客户端(即另一个邮件服务器或邮件用户代理)可以使用 STARTTLS 命令升级当前连接。总之流程是这样的:

< 220 server.example.com SMTP ready
> EHLO client.example.org
> 250-8BITMIME
> 250 STARTTLS
> STARTTLS
< 220 go ahead
... TLS handshake happens, initiated by client ...
> EHLO client.example.com
< 250-8BITMIME
< 250 AUTH PLAIN LOGIN
...

... but I never saw in the logs any remote server trying to send STARTTLS

如果您不在对 EHLO 的响应中宣布支持 STARTTLS,则客户端将不会尝试 STARTTLS。

... see that lock icon in Gmail, when I connect to google MX servers to send an email all I have to do is start a TLS session with STARTTLS on that port 25? Do I need a certificate validated by an authority just like SSL?

仅当您是接收邮件的邮件服务器时才需要证书,因此如果使用 STARTTLS 则可用作 TLS 服务器。在向 gmail 发送邮件的情况下,您是发送邮件的客户端。在这种情况下,您可能会使用客户端证书,但您并不需要这样做。并且由于您使用的是 Perl:只要安装了 IO::Socket::SSL,当前版本的 Net::SMTP(从版本 3.x 开始)就已经包含了对 TLS 的支持。您只需按照记录添加对 starttls 的调用即可使用 TLS 发送邮件。

I understand that the STARTTLS command is intended to upgrade the tcp connection to TLS, but am I really expected (as a server) to do that on remote port 25?

是的。由 RFC 3207 定义 对于 "real" SSL 连接,使用端口 465 或 587,但不应再使用 465。 我不了解你的客户,因为你问的是服务器协议。