openssl 为 STARTTLS 协商 SSL 加密

Posted

技术标签:

【中文标题】openssl 为 STARTTLS 协商 SSL 加密【英文标题】:openssl to negotiate SSL encryption for STARTTLS 【发布时间】:2013-01-16 10:14:24 【问题描述】:

我正在使用 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    

【问题讨论】:

我想这就是你需要的Test SMTP/IMAP(S)/POP3(S) configuration from the command line 【参考方案1】:

您似乎混淆了 shell(在其中键入命令,例如 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,它完成了执行 EHLo 和通过 STARTTLS 启动 TLS 会话的所有必要任务。但是我一直收到“在 /usr/lib/perl5/site_perl/5.14/IO/Socket/SSL.pm 第 308 行指定的 SSL_version 无效”。有没有其他方法可以建立 STARTTLS 连接? (我有钥匙/证书,也知道它们的位置) 必须编写一个应用程序,它还需要能够使用 SSL/TLS 库。如果您只想了解 SMTP 如何使用 STARTTLS 对服务器起作用,请使用您的 openssl s_client ... 命令:它的行为类似于您在 STARTTLS 之后使用 telnet 编写的内容,如果您想查看在 STARTTLS 之前发生了什么(和加密的 STARTTLS 数据),使用 Wireshark 查看流量。 实际上,我首先编写了一个 perl 脚本,并希望使用 Net::SMTP,但正如我刚才所说,我最终遇到了更多错误。非常感谢您帮助我收集事实。

以上是关于openssl 为 STARTTLS 协商 SSL 加密的主要内容,如果未能解决你的问题,请参考以下文章

OpenSSL:从客户端发起的重新协商

STARTTLS 与 SSL/TLS [关闭]

starttls 与ssl的区别

SSL vs TLS vs STARTTLS (转)

支持 GMail TLS/STARTTLS 与 SSL 的 Curl SMTP 命令行参数是啥

测试Apache使用Openssl及修改Openssl加密算法执行顺序