使用openssl协商SSL加密以进行STARTTLS。

16

我正在使用openssl来正常连接SMTP服务器(未加密),发送STARTTLS命令,协商SSL加密,然后与加密会话进行交互。

这是我正在使用的命令(通过telnet):

openssl s_client -starttls smtp -crlf -connect 1.2.3.4:25

我该如何确保TLS握手成功?

到目前为止使用的命令序列如下:

<< 220 example.com ESMTP ready
>> EHLO localhost
<< 250-smtp.mail.yahoo.com
<< 250-PIPELINING
<< 250-AUTH PLAIN LOGIN CRAM-MD5
<< 250 STARTTLS
>> STARTTLS
<< 220 2.0.0 Start TLS
>> openssl s_client -starttls smtp -crlf -connect 127.0.0.1:587    

我认为这是你需要的:从命令行测试SMTP/IMAP(S)/POP3(S)配置 - transang
1个回答

28

您似乎将控制台(用于键入诸如 telnetopenssl 之类的命令)和套接字协议混淆了。

使用 telnet 连接到 SMTP 等协议的端口是一种快速的技巧,它允许您直接键入通常需要为该协议实现客户端而编程的内容。对于基于文本的协议,它可能有些作用,但它有限制。特别是,您将很难通过此方式键入 TLS 握手:首先,您可能无法找到需要发送的某些字节的正确键;其次,您肯定无法阅读服务器发送给您的内容。简而言之,这种方法毫无意义。

openssl s_client -starttls smtp -crlf -connect 127.0.0.1:587 已经可以完成您试图使用 telnet 进行的操作:它打开与该服务器的连接,发送 EHLO SMTP 命令,发送 STARTTLS SMTP 命令,然后开始握手。 OpenSSL 命令本身根本不是 SMTP 协议的一部分,不得在 SMTP 套接字上发送。

运行此命令时,您将得到类似于已执行握手的 telnet 会话的结果,因为您应该能够以与 telnet 相同的方式使用其标准输入/输出。

尽管如此,使用 telnetopenssl s_client 发送 SMTP 命令都最多只是调试技术。


感谢您的回复。我从在线教程中获取了这个命令集,但对于实际发生的事情感到困惑。我想建立STARTTLS连接以了解其工作原理。一开始我使用的是Net::SMTP::TLS,它执行所有必要的任务,包括通过STARTTLS进行EHLo并启动TLS会话。但是我一直收到“invalid SSL_version specified at /usr/lib/perl5/site_perl/5.14/IO/Socket/SSL.pm line 308”的错误。是否有其他方法可以建立STARTTLS连接?(我已经放置了密钥/证书,并知道它们的位置) - studying algorithms
不写一个应用程序是不行的,而这个应用程序也需要能够使用SSL/TLS库。如果你只是想了解如何使用STARTTLS与服务器进行SMTP通信,可以使用openssl s_client ...命令:它会表现得类似于在STARTTLS后使用telnet编写的内容。如果你想看看STARTTLS之前发生了什么(以及加密的STARTTLS数据),请使用Wireshark查看流量。 - Bruno
其实,我一开始是在写Perl脚本,希望能使用Net::SMTP,但正如我刚才所说,结果却遇到了更多的错误。非常感谢你帮助我收集这些信息。 - studying algorithms

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