使用ESP8266上的安全TLS连接为新电子邮件发送硬件举报程序

当基于ESP8266的Arduino IDE for Wi-Fi模块出现时,我可以更方便地对其进行编程了。缺少用于控制的外部控制器带来了另一个巨大的优势。使用此模块的各种电子小工具的想法立即浮现在脑海。因此想到了让硬件自治的线人了解我的电子邮件中是否有新信件到达。结果,电子邮件通知程序设备诞生了。
图片

详细信息如下。

设备会定期与邮件服务器建立TLS连接,并请求字母数。在第一次通话时,会记住字母的数量。然后,随着框中字母的数量增加,决定是否有新字母到达,并打开声音和声音警报。单击按钮或从邮箱中删除邮件时,将对事件进行确认。声音警报持续约15秒钟,灯光警报持续一秒钟,直到用户确认事件为止。该设备以灯的形式制成,并且可以作为普通灯使用。当您按下按钮时,指示灯会平稳地点亮。按住按钮时,发光光谱会平滑变化。指示灯点亮时,短按按钮可使发光平滑地变暗。您还可以使用适当的软件通过智能手机或计算机上的UDP连接来设置发光的颜色。
可通过设备的网页配置Wi-Fi连接,邮箱的登录名和密码设置等。支持多个邮件服务器。
当前,知名的邮件服务器通过安全连接工作。使用POP3协议命令使用服务器之前,必须先获得您的授权。在这里,我们需要TLS协议。对我而言,最困难的事情是与邮件服务器建立TLS连接。与Arduino IDE一起,有一个使用SSL连接访问网页的示例。已检查-有效!现在,我只需要了解什么是指纹,就可以在SSL示例代码中找到它。对于网页,一切都很清楚,因为在浏览器的连接属性中,此指纹存在。但是我需要创建与汗水服务器的连接。我开始研究这个问题。找到了一个很棒的OpenSSL工具。一组程序使您可以做很多有趣的事情。这实质上是具有SSL连接的Telnet。我试图去邮件服务器,瞧,与邮件服务器的TLS连接已建立!此外,我已经可以使用常规的POP3和IMAP协议命令。仍然需要从证书中提取我需要的指纹。这是通过以下命令完成的:
openssl s_client -connect pop3.mail.ru:995

之后,将建立安全连接,并在下面显示邮件服务器邀请。此外,我们也像Telnet一样工作。用户,通过,统计 您也可以使用IMAP。谁喜欢更多。只需更改邮件服务器的地址和端口。
现在,我们需要获取证书并从中提取指纹,这是SSL库所需要的。
也许有一种更简单的方法,我不详细了解OpenSSL工具包的密钥,所以我将告诉您如何自己做。因此,我们执行以下行:
openssl s_client -connect pop3.mail.ru:995 >crt

之后,我们退出程序,当前目录中的crt文件将存储所需的证书。像这样
证书示例
-----BEGIN CERTIFICATE-----
MIIE5jCCA86gAwIBAgIQEuH8d4WVsue+Ohe/WiSqgDANBgkqhkiG9w0BAQUFADBE
MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMU
R2VvVHJ1c3QgU1NMIENBIC0gRzIwHhcNMTUwODI3MDAwMDAwWhcNMTYwODI2MjM1
OTU5WjByMQswCQYDVQQGEwJSVTEbMBkGA1UECBQSUlVTU0lBTiBGRURFUkFUSU9O
w/s63J8N2ihPDA==
-----END CERTIFICATE-----

将--BEGIN CERTIFICATE--和--END CERTIFICATE--之间的所有内容(包括这些标签本身)复制到一个单独的文件中。称之为mail.key。现在,我们使用以下命令获得了期待已久的指纹:
openssl x509 -in mail.key -fingerprint -sha1 -noout -text >keyprint

现在,在指纹文件中,我们的指纹将存储在第一行中。对于服务器pop3.mail.ru,它将为
SHA1指纹= E0:10:11:B5:E6:C9:1B:7B:90:88:F8:A6:AE:6E:21:97:69:30:7A: 04
实际上,这是设备开发中最困难的任务。我们必须处理所有这些细微差别,但事实证明我很高兴!
对于其他邮件服务器,一切都完全相同。您必须为相应的POP3或IMAP协议指定服务器名称和端口。我从不需要使用安全连接,因此我重复一遍,可能有一种更简单的方法。

已收到所有源数据,现在我们正在快速为ESP8266编写一个程序,令我们惊讶的是,一切正常!该程序从邮件地址中提取服务器名称,并将与服务器相对应的证书指纹替换为SSL功能。
因此,我们有机会在许多服务器上使用邮箱。
我将单独给出通过建立TLS连接访问邮件服务器的过程。
上诉程序
const char *ssid = «yourSSID»;
const char *password = «yourPassword»;
const char* host = «pop3.mail.ru»;
const char* mailuser = «mymail mail.ru»;
const char* mailpass = «mypassword»;
const int httpsPort = 995;
const char* fingerprint = «E0 10 11 B5 E6 C9 1B 7B 90 88 F8 A6 AE 6E 21 97 69 30 7A 04»; // SHA1 pop3.mail.ru:995

// mail.ru
void CheckMail(void)
{
String line;

if (!client.connect(host, httpsPort))
{
Serial.println(«MAIL#ERR»);
client.flush();
return;
}

if (!client.verify(fingerprint, host)) //
{
Serial.println(«MAIL#Error certificate»);
client.flush();
return;
}
line = client.readStringUntil('\n');

client.print(String(«USER „)+mailuser+String(“\r\n»));
line = client.readStringUntil('\n');

client.print(String(«PASS „)+mailpass+String(“\r\n»));
line = client.readStringUntil('\n');
if (line==String("+OK Welcome!\r"))
{
client.print(String(«STAT\r\n»));
line = client.readString();
Serial.println(line);

client.print(String(«QUIT\r\n»));
line = client.readStringUntil('\n');
}
else { Serial.println(«MAIL#ERA»); }

client.flush();
client.stop();
}
// **** mail.ru



硬件描述
电路图很简单。我使用了ESP-12模块,即“智能” WS2812b LED。
图片

该设备由USB供电,并由内置的650 mAh电池供电,该电池在通知模式下可连续工作2个小时-“您将收到一封信!”。TP4056芯片上的电池充电器。
单独的输出连接器,用于ESP-12在线编程。
图片

图片

图片

图片


软件部分说明
该程序的开发在Arduino 1.6.4环境中进行,并安装了ESP8266 SDK。主要功能来自示例。 ESP8266模块配置为混合操作:接入点和客户端。首次开启时,您需要配置Wi-Fi连接参数(登录,密码),邮箱和邮箱密码。为此,您需要通过Wi-Fi连接连接到“ MailNotifier”访问点密码:qwertyqwerty。将打开一个页面,您必须在该页面上输入数据并重新启动模块。数据被写入模块的非易失性存储器。打开电源后,将读取设置,并且我们的信息提供者与Internet接入点之间将建立连接。该过程伴有闪烁的蓝色LED。成功连接后,LED会亮黄色并熄灭。从这一刻起,告密者会定期轮询邮件服务器,并且在收到新信件时会发出声音和声音信号通知。如果尝试与接入点建立连接失败,则LED开始以红色闪烁。
图片


改进
示例中的NTP服务器已添加到程序中;您可以从中获取系统时间。有想法增加警报,但改变了主意,因为 不用了
您还可以通过UDP连接到设备并传输数据流,以分别打开每个LED。例如,通过Winamp的相应插件可视化音乐。还有更多。
我还使用光敏电阻控制光,例如,晚上不打开声音警报。但是在此版本中,未以编程方式使用此功能。
没问题,您可以添加指示器以显示消息标题或其他内容。但这一切都是为了未来。

图片


最后,一段视频演示了线人的工作。


3D-LIFE 团队的朋友们帮助设计和打印了表壳,对此深表感谢!现在设备已完成外观。

感谢Arduino IDE和ESP8266集成的作者的出色工作!

包含电路,SL4中的印刷电路板和源的项目档案

Source: https://habr.com/ru/post/zh-CN392885/


All Articles