2

我正在开发一个具有 SMTP 功能的嵌入式应用程序(运行 MQX RTOS,用 C 编写)。最近,使用 Mocana NanoSSL 库添加了 TLS 支持。我目前能够使用 Gmail、Yahoo 和私人交换服务器成功发送电子邮件。不幸的是,Hotmail 不起作用。这是我使用的连接参数:

服务器:smtp.live.com
端口:25 和 587
验证方法:PLAIN 和 LOGIN

基本上,我能够成功连接到服务器,执行 SSL/TLS 握手(使用 STARTTLS),并将加密的 EHLO 消息发送到服务器(接收响应)。根据此响应,服务器同时支持 AUTH PLAIN 和 AUTH LOGIN。但是,一旦我发送了这些命令中的任何一个,我为获取响应而进行的以下 SSL_recv() 调用将失败,并出现超时或connection reset by peer.

更新:
好的,所以经过一些实验,我的问题似乎在于 SSL 库级别,而不是 Microsoft 的 SMTP 服务器。我尝试用标准 RTCS 套接字 recv() 调用替换 SSL_recv() 调用,并且能够接收和查看加密数据。通过禁用我的响应验证,我能够继续通过 SMTP 进程并成功发送消息。目前我不确定为什么 SSL_recv() 调用无法获取套接字数据,但我会继续挖掘,希望能找到答案。

4

2 回答 2

1

好吧,我也让它在这里工作。我不得不更换

ssl_ctx=SSL_CTX_new(SSLv23_client_method());

与:

ssl_ctx=SSL_CTX_new(SSLv3_client_method());

或者

ssl_ctx=SSL_CTX_new(TLSv1_client_method());

我的理解是 23_client 方法首先发送一个 SSL2 客户端问候,这使服务器感到困惑。我在 HP SSL 编程教程中读到了这个:

http://h71000.www7.hp.com/doc/83final/ba554_90007/ch04s03.html

它说:“但是,使用 SSLv23 方法的 SSL 客户端无法与使用 SSLv3/TLSv1 方法的 SSL 服务器建立连接,因为 SSLv2 hello 消息是由客户端发送的。”

SSL3 也可以工作,因为您可以在使用 SSL 的 STARTTLS 之后继续,您不必使用 TLS。

见这里: https ://www.fastmail.fm/help/technology_ssl_vs_tls_starttls.html

于 2013-08-14T06:36:09.743 回答
0

所以,这里似乎让我失望的是 SSL 库本身。通过简单地不调用 SSL_recv() 来验证服务器响应,我能够绕过该问题并成功发送电子邮件。我显然无法进行错误检查或获得任何有意义的失败反馈,但对于服务器接受我所有的 SMTP 消息的成功用例,电子邮件已发送。

于 2013-08-19T20:10:07.120 回答