向电子邮件服务器发送STARTTLS命令后必须发送哪些数据 我正在用WiSoCK2API编写一个C++电子邮件客户端,通过Gmail帐户从SMTP发送电子邮件。我没有使用任何其他第三方库

向电子邮件服务器发送STARTTLS命令后必须发送哪些数据 我正在用WiSoCK2API编写一个C++电子邮件客户端,通过Gmail帐户从SMTP发送电子邮件。我没有使用任何其他第三方库,c++,windows,email,winsock2,tls1.2,C++,Windows,Email,Winsock2,Tls1.2,我已经在587端口(用于TLS)连接到Gmail服务器并发送了基本的EHLO和STARTTLS命令,但我的问题是,在发送STARTTLS命令后,我应该具体发送哪些数据 为了清晰起见,这是服务器输出: 显然,TLS握手是在STARTTLS命令之后进行的,但是在TLS握手过程中必须发送的第一个和后续数据段是什么?从我读到的内容来看,应该是二进制数据交换安全证书等,但我找不到应该首先发送哪些数据 我已经搜索了许多类似的问题,但我没有找到一个答案,说明在STARTTLS之后必须发送的特定的数据。我知道

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

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

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


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

SMTP
STARTTLS
命令的语义和处理规则记录在中

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

MSDN记录了的高级概述,以及的分步说明。每个步骤的具体细节记录在(TLS 1.0)、(TLS 1.1)和(TLS 1.2)的第7节中


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

请仔细阅读我的问题。我已经知道我必须在STARTTLS命令之后执行TLS握手,我具体询问应该为握手发送什么数据。我已经阅读了RFC,但它仍然没有告诉我要发送什么数据。例如,它指定我必须在收到服务器的回复后发送证书结构,但我已经尝试过,并且刚刚收到服务器的“准备启动tls”回复。我再次要求在与电子邮件服务器进行TLS握手时发送数据。@shmoo:我确实读过你的问题。如果你注意我指出的RFC,它们会准确地告诉你发送什么以及何时发送。按照RFC 3207中的定义,除非服务器先发送
STARTTLS
220应答,否则无法执行TLS握手。然后执行握手,首先发送TLS
ClientHello
记录并接收RFCs 2246、4346和5246第7节(“TLS握手协议”)中定义的
ServerHello
记录。您需要更仔细地阅读RFC,您要寻找的答案都记录在RFC中。@shmoo:如果您阅读了我指出的MSDN文档,它将一步一步地为您提供TLS握手的非常清晰的概述。RFC为您提供了每个步骤的具体技术细节(格式和内容)。@shmoo Yuor的评论太荒谬了。这些是TLS RFC。如果你认为他们没有详细说明握手的细节,你就不可能读过他们。但是,如果您希望自己实现SSL,那么现在应该忘记这一点。使用OpenSSL或其他现有库之一。这是一项巨大的工作。不,ClientHello在发送STARTTLS命令后不工作,是的,我已经阅读了RFC,但服务器不接受我发送的任何内容