检查 SMTP 服务器是否启用 SSL 的最佳方法是什么?
后续问题:如果尚未启用 SSL,如何使其启用 SSL。
操作系统是CentOS。
答案1
这取决于您指的是 SSL 还是 TLS。
SSL在 TCP/465 上有自己的专用端口。测试其存在的最佳方法是使用 OpenSSL 的出色 s_client,它将为您协商 SSL 技巧。
openssl s_client -connect localhost:465
如果您的服务器未绑定到本地主机,那么显然请将其替换为 IP 或主机名。
TLS乍一看,它看起来就像普通的 SMTP。加密是从纯文本协议协商而来,并建立在纯文本协议之上。您可以通过向服务器发出 EHLO 请求来测试它是否可用。您可以使用 Netcat 或 Telnet 客户端来执行此操作。
$ nc -v localhost 25 localhost [127.0.0.1] 25 (smtp) open 220 mail.example.com ESMTP Exim 4.69 Fri, 11 Sep 2009 09:25:20 +0100 ehlo test 250-mail.example.com Hello localhost [127.0.0.1] 250-SIZE 10485760 250-PIPELINING 250-STARTTLS 250 HELP
重要的行是倒数第二行(250-STARTTLS
),它宣传了 STARTTLS 功能。
为了说明如何为您的邮件服务器启用 SSL/TLS,您需要告诉我们您正在使用什么邮件包。
答案2
在我看来,此页面给出的答案完全是错误的。
原因是 SSL/TLS + SMTP 可能意味着两种不同的事情。
一种是将套接字包装在 SSL/TLS 中。如果服务器想要同时为未加密和加密流量提供服务,则需要两个端口,每种流量一个。按照惯例,SMTP 服务器通常使用端口 25 来处理未加密流量,使用端口 465 来处理加密流量。通过使用 stunnel 等外部工具,实际上可以这样实现,即客户端和服务器都不知道实际流量在加密套接字上传输。因此,即使您的 SMTP 服务器不支持 SSL/TLS,您也可以实施这种方法。但 sendmail 和 postfix 等服务器确实支持此功能,因此不需要外部工具。
另一种方法是启动TLS被使用。这是 SMTP 协议的扩展,因此需要服务器和客户端都支持它。使用 STARTTLS,服务器可以通过同一个套接字提供加密流量和未加密流量,即您可以将端口 25 用于两者。您可以通过在端口 25 上连接到 SMTP 服务器并发出命令来查看它是否启用了 STARTTLS,EHLO
正如 Dan 在本页其他地方解释的那样。
SSL 和 TLS 都只是加密协议,TLS 是 SSL 的后继者。
我的信息来自这里。
SMTP 服务器使用的术语加剧了这两种方法之间的混淆。想想 Postfix 的参数smtpd_tls_security_level
和smtpd_use_tls
及其相关文档。这些参数处理STARTTLS
,而不是TLS
。其他 SMTP 服务器在混淆术语方面做得同样出色。
答案3
有一个简单的工具可以实现这一点。你给他们发一封电子邮件,他们会回复一堆详细信息:
答案4
如果您运行的是 CentOS,则可能正在使用 Sendmail。安装 Sendmail-mc 包。/etc/mail/sendmail.mc 中有一些指令供您查看 TLS:
dnl # Rudimentary information on creating certificates for sendmail TLS:
dnl # cd /usr/share/ssl/certs; make sendmail.pem
dnl # Complete usage:
dnl # make -C /usr/share/ssl/certs usage
dnl #
dnl define(`confCACERT_PATH', `/etc/pki/tls/certs')dnl
dnl define(`confCACERT', `/etc/pki/tls/certs/ca-bundle.crt')dnl
dnl define(`confSERVER_CERT', `/etc/pki/tls/certs/sendmail.pem')dnl
dnl define(`confSERVER_KEY', `/etc/pki/tls/certs/sendmail.pem')dnl
一旦完成上述操作,您就可以通过 SSL 启用 Sendmail,如下所示:
DAEMON_OPTIONS(`Addr=142.46.200.221, Port=465, Name=SSA, M=Eas')
哦,在把它做好之前,还要留出大量的时间来玩它。
当我完成此操作时,我几乎总是必须运行三个 sendmail 实例:
- 一个在端口 587 上启用 TLS,并具有各种 SMTP-AUTH 配置(因此经过身份验证的远程用户可以发送任意邮件);
- 一个在端口 465 上启用了 SSL,并具有各种 SMTP-AUTH 配置(原因相同,客户端不同(感谢 Microsoft Outlook“Express”);并且
- 一个启用了 TLS 但没有 AUTH 的邮件,被锁定,以便它只接收有效本地收件人的邮件(远程发件人可以根据需要使用或不使用 TLS)。
每个都有单独的配置文件。应该有办法让前两个作为同一个实例运行,监听两个端口,但我总不能让它正常工作。
如果规模足够大,这些不同的实例就可以在不同的机器上运行。