我正在使用Winsock2 API用C++编写电子邮件客户端,以通过SMTP从Gmail帐户发送电子邮件。我没有使用任何其他第三方库。
我已在端口587(用于TLS)上连接到Gmail服务器,并发送了基本的EHLO和STARTTLS命令,但是我的问题是,发送STARTTLS命令后,我应该专门发送哪些数据?
为了清楚起见,这是服务器输出:
显然,TLS握手是在STARTTLS命令之后进行的,但是在TLS握手期间必须发送的第一个数据和后续数据是什么?从我所读的内容来看,应该是交换安全证书等的二进制数据,但是我找不到具体应该首先发送的数据。
我已经搜索了许多类似的问题,但是没有找到答案,该答案表明必须在STARTTLS之后发送的特定数据。我知道OpenSSL的存在,并且我不会接受任何告诉我安装它的答案。
最佳答案
SMTP STARTTLS
命令的语义和处理规则记录在RFC 3207中。
在成功收到对STARTTLS
命令的220响应之后,您必须随后开始TLS握手以建立加密,并使用该加密来加密/解密后续的SMTP命令/响应。握手完成后,SMTP状态将重置,因此您必须发出新的(现已加密)EHLO
命令,然后根据需要继续使用其余的(已加密)SMTP命令。
MSDN提供了Transport Layer Security Protocol的高级概述,并提供了TLS Handshake Protocol的分步说明。 RFC 2246(TLS 1.0),RFC 4346(TLS 1.1)和RFC 5246(TLS 1.2)的第7节中记录了每个步骤的详细信息。
因此,除非您打算从头开始实现TLS(请不要!!),否则需要使用第三方库(例如OpenSSL),或者可以使用Microsoft的Secure Channel API来处理TLS握手和后续加密为了你。
关于c++ - 将STARTTLS命令发送到电子邮件服务器后必须发送什么数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33661956/