1

我正在使用 Winsock2 API 在 C++ 中编写一个电子邮件客户端,以通过 SMTP 从 Gmail 帐户发送电子邮件。我没有使用任何其他第三方库。

我已在端口 587(用于 TLS)上连接到 Gmail 服务器并发送了基本的 EHLO 和 STARTTLS 命令,但我的问题是,在发送 STARTTLS 命令后我应该具体发送哪些数据?

为清楚起见,这是服务器输出:

为清楚起见,这是服务器输出

显然 TLS 握手在 STARTTLS 命令之后进行,但是在 TLS 握手期间必须发送的第一条和后续数据是什么?从我读过的内容来看,它应该是交换安全证书等的二进制数据,但我找不到具体应该首先发送哪些数据。

我已经搜索了许多与此类似的问题,但我没有找到一个答案,说明必须在 STARTTLS 之后发送的特定数据。我知道 OpenSSL 的存在,我不会接受任何告诉我安装它的答案。

4

1 回答 1

3

STARTTLSSMTP命令的语义和处理规则记录在RFC 3207中。

在您收到对命令的成功 220 响应后STARTTLS,您必须开始 TLS 握手以建立加密,以加密/解密后续 SMTP 命令/响应。握手完成后,SMTP 状态被重置,因此您必须发出一个新的(现已加密的)EHLO命令,然后根据需要继续执行剩余的(加密的)SMTP 命令。

MSDN 记录了传输层安全协议的高级概述,以及TLS 握手协议的分步说明。每个步骤的具体细节记录在RFC 2246 (TLS 1.0)、RFC 4346 (TLS 1.1) 和RFC 5246 (TLS 1.2) 的第 7 节中。

因此,除非您打算从头开始实施 TLS(请不要!!),否则您需要使用第三方库,例如 OpenSSL,或者您可以使用 Microsoft 的Secure Channel API 来处理 TLS 握手和后续为您加密。

于 2015-11-12T00:08:07.117 回答