Denunciante de hardware para novos emails usando uma conexão TLS segura no ESP8266

Quando o módulo Arduino IDE para Wi-Fi baseado no ESP8266 apareceu, foi possível programá-lo de maneira mais conveniente. E a falta de um controlador externo para controle apresenta outra enorme vantagem. As idéias de diferentes aparelhos eletrônicos com o uso deste módulo entraram imediatamente na minha cabeça. E assim surgiu o pensamento de tornar um informante autônomo de hardware sobre a chegada de novas cartas ao meu e-mail. Como resultado, o dispositivo Notificador de E-mail nasceu.
imagem

Detalhes abaixo.

O dispositivo estabelece periodicamente uma conexão TLS com o servidor de correio e solicita o número de letras. Na primeira chamada, o número de letras é lembrado. Então, com um aumento no número de letras na caixa, é tomada uma decisão sobre a chegada de uma nova letra, os alarmes de luz e som são ativados. O reconhecimento do evento ocorre com o clique de um botão ou quando uma mensagem é excluída da caixa de correio. O alarme sonoro dura cerca de 15 segundos e o alarme leve até o usuário reconhecer o evento. O dispositivo é fabricado na forma de uma lâmpada e funciona, incluindo, como uma lâmpada comum. Quando você pressiona o botão, a luz acende suavemente. Quando você mantém pressionado o botão, o espectro do brilho muda suavemente. Um breve toque no botão quando a luz está acesa leva a um escurecimento suave do brilho.Você também pode definir a cor do brilho através de uma conexão UDP de um smartphone ou computador com o software apropriado.
As configurações de conexão Wi-Fi, login e senha da caixa de correio etc. são definidas na página da web do dispositivo. Vários servidores de correio são suportados.
Servidores de correio conhecidos atualmente trabalham através de conexões seguras. Antes de trabalhar com o servidor usando os comandos do protocolo POP3, você deve estar autorizado. Aqui precisamos do protocolo TLS. O mais difícil para mim foi estabelecer uma conexão TLS com o servidor de correio. Juntamente com o IDE do Arduino, havia um exemplo de acesso a uma página da Web usando uma conexão SSL. Verificado - funciona! Agora, só preciso entender o que é uma impressão digital, que está presente no código de exemplo SSL. Para páginas da web, tudo está claro, porque nas propriedades de conexão do navegador, esta impressão digital está presente. Mas preciso criar uma conexão com o servidor suor. Comecei a pesquisar o assunto. Encontrei uma ferramenta OpenSSL legal. Um conjunto de programas permite fazer muitas coisas interessantes. Este é essencialmente o Telnet com uma conexão SSL. Tentei ir para o servidor de e-mail e eis queA conexão TLS com o servidor de correio foi estabelecida! Além disso, eu já podia trabalhar com os comandos habituais dos protocolos POP3 e IMAP. Resta extrair a impressão digital necessária do certificado. Isso é feito através do comando:
openssl s_client -connect pop3.mail.ru:995

Depois disso, uma conexão segura é estabelecida e o convite do servidor de email fica visível abaixo. Além disso, trabalhamos também como no Telnet. USUÁRIO, PASSE, STAT. Você também pode usar o IMAP. Quem gosta mais. Só é necessário alterar o endereço e a porta do servidor de email.
Agora precisamos obter o certificado e extrair a impressão digital dele, o que precisamos para a biblioteca SSL.
Talvez exista uma maneira mais simples: eu não entendi as chaves do kit OpenSSL em detalhes, por isso vou lhe dizer como fazer isso sozinho. Então, executamos a linha:
openssl s_client -connect pop3.mail.ru:995 >crt

Depois disso, saímos do programa e o arquivo crt no diretório atual armazenará o certificado que precisamos. Algo assim
Exemplo de certificado
-----BEGIN CERTIFICATE-----
MIIE5jCCA86gAwIBAgIQEuH8d4WVsue+Ohe/WiSqgDANBgkqhkiG9w0BAQUFADBE
MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMU
R2VvVHJ1c3QgU1NMIENBIC0gRzIwHhcNMTUwODI3MDAwMDAwWhcNMTYwODI2MjM1
OTU5WjByMQswCQYDVQQGEwJSVTEbMBkGA1UECBQSUlVTU0lBTiBGRURFUkFUSU9O
w/s63J8N2ihPDA==
-----END CERTIFICATE-----

Copie tudo entre --BEGIN CERTIFICATE-- e --END CERTIFICATE--, incluindo esses rótulos, em um arquivo separado. Chame-o de mail.key. E agora obtemos a tão esperada impressão digital com o comando:
openssl x509 -in mail.key -fingerprint -sha1 -noout -text >keyprint

Agora, no arquivo de impressão da chave, nossa impressão digital será armazenada na primeira linha. Para o servidor pop3.mail.ru, será
SHA1 Fingerprint = E0: 10: 11: B5: E6: C9: 1B: 7B: 90: 88: F8: A6: AE: 6E: 21: 97: 69: 30: 7A: 04
Na verdade, essa foi a tarefa mais difícil no desenvolvimento do dispositivo. Tivemos que chegar a todas essas nuances, mas quando acabei, fiquei muito feliz!
Para outros servidores de email, tudo é exatamente o mesmo. Você deve especificar o nome e a porta do servidor para o protocolo POP3 ou IMAP correspondente. Como nunca tive que trabalhar com conexões seguras, repito, pode haver uma maneira mais simples.

Todos os dados de origem foram recebidos, agora estamos escrevendo rapidamente um programa para o ESP8266 e estamos surpresos que tudo funcione! O programa extrai o nome do servidor do endereço para correspondência e substitui a impressão digital do certificado correspondente ao servidor na função SSL.
Assim, temos a oportunidade de trabalhar com caixas de correio em muitos servidores.
Darei o procedimento separadamente para acessar o servidor de correio com o estabelecimento de uma conexão TLS.
Procedimento de recurso
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



Descrição do hardware O
diagrama do circuito é simples. Eu usei o módulo ESP-12, LEDs "inteligentes" WS2812b.
imagem

O dispositivo é alimentado por USB e por uma bateria interna de 650 mAh, que dura 2 horas de operação no modo de informação - “Você receberá uma carta!”. Carregador de bateria no chip TP4056.
Conector de saída separado para programação em circuito ESP-12.
imagem

imagem

imagem

imagem


Descrição da parte do software
O desenvolvimento do programa foi realizado em um ambiente Arduino 1.6.4 com o SDK para ESP8266 instalado. As principais funções foram extraídas de exemplos. O módulo ESP8266 está configurado para operação mista: ponto de acesso e cliente. Ao ativá-lo pela primeira vez, você precisa configurar os parâmetros de conexão Wi-Fi (login, senha), caixa de correio e senha da caixa de correio. Para fazer isso, você precisa se conectar via Wi-Fi à senha do ponto de acesso "MailNotifier": qwertyqwerty. Uma página será aberta, na qual você deve inserir dados e reiniciar o módulo. Os dados são gravados na memória não volátil do módulo. Quando a energia é ligada, as configurações são lidas e começa o processo de estabelecer uma conexão entre nosso informante e o ponto de acesso à Internet. O processo é acompanhado por um LED azul piscando. Após uma conexão bem-sucedida, o LED acende em amarelo e apaga.A partir desse momento, o informante pesquisa periodicamente o servidor de correio e, no caso de uma nova carta, informa com um sinal de luz e som. Se a tentativa de estabelecer uma conexão com o ponto de acesso falhar, o LED começará a piscar em vermelho.
imagem


Melhorias
O servidor NTP dos exemplos foi adicionado ao programa, e você pode obter a hora do sistema. Havia pensamentos para adicionar alarmes, mas mudei de idéia, porque não precisa.
Você também pode conectar-se ao dispositivo via UDP e transmitir um fluxo de dados para ligar individualmente cada LED. Por exemplo, através do plugin apropriado do Winamp para visualizar músicas. E muito mais
Também usei um fotorresistor para controlar a iluminação, para que, por exemplo, não acione o alarme sonoro à noite. Mas nesta versão, essa função não é usada programaticamente.
Sem problemas, você pode adicionar um indicador para exibir cabeçalhos de mensagens ou outra coisa. Mas isso é tudo para o futuro.

imagem


Finalmente, um vídeo demonstrando o trabalho de um informante.


Amigos da equipe 3D-LIFE ajudaram a projetar e imprimir a caixa , pela qual agradecemos muito! Agora, o dispositivo adquiriu uma aparência final.

Obrigado ao autor da integração do Arduino IDE e do ESP8266 pelo excelente trabalho!

Arquivo do projeto com circuito, placa de circuito impresso no SL4 e fonte

Source: https://habr.com/ru/post/pt392885/


All Articles