2013-07-31 86 views
2

我正在研究具有SMTP功能的嵌入式应用程序(运行MQX RTOS,用C编写)。最近,使用Mocana NanoSSL库添加了TLS支持。我目前能够使用Gmail,Yahoo和私人交易服务器成功发送电子邮件。不幸的是,Hotmail不起作用。这里是连接参数,我用:AUTH命令上的Hotmail/Outlook.com连接失败

服务器:smtp.live.com
端口:25和587
AUTH方法:平原和LOGIN

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

UPDATE:
好的,经过一番实验后,我的问题出现在SSL库级别,而不是微软的SMTP服务器。我尝试用标准RTCS套接字recv()调用替换SSL_recv()调用,并能够接收和查看加密数据。通过禁用我的响应验证,我可以继续通过SMTP过程并成功发送消息。此时我不确定为什么SSL_recv()调用无法获取套接字数据,但我会继续挖掘并希望找到答案。

+0

有时邮件服务器只是放弃连接而不是礼貌,以减少垃圾邮件机器人浪费的时间。这可能表明收到的消息中的一个小错误不是100%标准。 –

+0

现在这个问题似乎在某处的SSL堆栈中。我关闭了我的响应验证并删除了SSL_recv调用(用RTCS recv()调用替换它们),现在一切正常。这意味着它一直在工作,并且它一直是对失败的SSL_recv的调用,而不是邮件服务器。随着更多信息的出现,我会更新此问题。 – Hippopatimus

回答

0

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

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方法,因为的SSLv2 hello消息的SSL服务器连接由客户发送。“

由于您可以在使用SSL的STARTTLS之后继续使用SSL3,因此您无需使用TLS。

在这里看到: https://www.fastmail.fm/help/technology_ssl_vs_tls_starttls.html

+0

不幸的是,SSLv3和TLSv1对我来说都有相同的结果。但是我没有使用OpenSSL,这是一个重要的区别。 – Hippopatimus

+0

这里很脆弱。它似乎只在协议是固定的而没有协商时才起作用。我现在将其设置为smtp.live.com的TLSv1。 它也适用于端口25。我不会测试端口587上的设置。 – Georg