Solicitação GET protegida por HTTPS NodeMCU ESP8266

Tempo de leitura: 5 minutes

Neste exemplo, aprendemos como enviar uma solicitação GET segura para uma página da Web https segura usando NodeMCU ou ESP8266? Como sabemos todas as páginas da web são protocolos HTTP, GET e POST são métodos de comunicação entre o navegador da web e o servidor. Além disso, você olha para a codificação de exemplo php do lado do servidor.

 

O que é HTTPS?

HTTPS (HTTP sobre SSL ou HTTP seguro) é o uso de Secure Socket Layer (SSL) ou Transport Layer Security (TLS) como uma subcamada sob camadas regulares de aplicativos HTTP. HTTPS criptografa e descriptografa solicitações de página do usuário, bem como as páginas que são retornadas pelo servidor Web. O uso de HTTPS protege contra espionagem e ataques man-in-the-middle. HTTPS foi desenvolvido pela Netscape.

HTTPS e SSL suportam o uso de certificados digitais X.509 do servidor para que, se necessário, um usuário possa autenticar o remetente. A menos que uma porta diferente seja especificada, o HTTPS usa a porta 443 em vez da porta HTTP 80 em suas interações com a camada inferior, TCP/IP.

 

O que é HTTP?

O Hypertext Transfer Protocol (HTTP) foi projetado para permitir a comunicação entre clientes e servidores.

O HTTP funciona como um protocolo de solicitação-resposta entre um cliente e um servidor. Cada mensagem HTTP (Hypertext Transfer Protocol) é uma solicitação ou uma resposta. Um servidor ouve uma solicitação em uma conexão, analisa cada mensagem recebida, interpreta a semântica da mensagem em relação ao destino da solicitação identificada e responde a essa solicitação com uma ou mais mensagens de resposta. Um cliente constrói mensagens de solicitação para comunicar intenções específicas, examina as respostas recebidas para ver se as intenções foram realizadas e determina como interpretar os resultados.

Um navegador da Web pode ser o cliente e um aplicativo em um computador que hospeda um site da Web pode ser o servidor.

Exemplo: Um cliente (navegador) envia uma solicitação HTTP ao servidor; em seguida, o servidor retorna uma resposta ao cliente. A resposta contém informações de status sobre a solicitação e também pode conter o conteúdo solicitado.

 

Dois métodos de solicitação HTTP: GET e POST

Dois métodos comumente usados para uma solicitação-resposta entre um cliente e um servidor são: GET e POST.

  • GET – Solicita dados de um recurso especificado
  • POST – Envia dados a serem processados para um recurso especificado

GET

O método GET solicita a transferência de uma representação selecionada atual para o recurso de destino. GET é o principal mecanismo de recuperação de informações e o foco de quase todas as otimizações de desempenho. Portanto, quando as pessoas falam em recuperar algumas informações identificáveis via HTTP, geralmente estão se referindo a fazer uma solicitação GET.

 

O método GET

Observe que a string de consulta (pares nome/valor) é enviada na URL de uma solicitação GET:

/test/demo_form.php?name1=value1&name2=value2
Algumas outras notas sobre solicitações GET:

  • As solicitações GET podem ser armazenadas em cache
  • As solicitações GET permanecem no histórico do navegador
  • As solicitações GET podem ser marcadas
  • As solicitações GET nunca devem ser usadas ao lidar com dados confidenciais
  • As solicitações GET têm restrições de comprimento
  • As solicitações GET devem ser usadas apenas para recuperar dados

 

Antes de ir diretamente para a programação certifique-se de ter a versão mais recente das placas ESP8266

Este exemplo usa BearSSL que agora é padrão (com a versão principal 2.5.0 por vir, ou a versão atual do git, não com core-2.4.2 e anteriores).

O sketch de exemplo para WiFiClientSecure falha ao compilar.

classe axTLS::WiFiClientSecure’ não tem membro chamado ‘setFingerprint’

Código de exemplo GET ESP8266

Faça alterações nas configurações wifi, SSID e senha da sua rede wifi e altere o ip do servidor. Altere também os dados da solicitação GET de acordo com os requisitos do servidor. e impressão digital SHA1.

Como obter impressão digital SHA1

Passo 1: Abra o link HTTPS no navegador da web

https://jsonplaceholder.typicode.com/comments?postId=7

Passo 2: Clique no ícone de cadeado verde e clique em mais informações ou certificado de segurança

Etapa 3: clique em Segurança e depois em Exibir certificado

Etapa 4: copie a impressão digital SHA1 e cole-a no código, remova os dois pontos

Faça as alterações necessárias no código e faça o upload.

/*
 * Conecta-se ao WiFi HotSpot. */

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h> 
#include <ESP8266WebServer.h>
#include <ESP8266HTTPClient.h>

/* Defina-os para suas credenciais desejadas. */
const char *ssid = "SSID";  //INSIRA SUAS CONFIGURAÇÕES DE WIFI
const char *password = "password";

//Link para ler os dados de https://jsonplaceholder.typicode.com/comments?postId=7
//Endereço da Web/Servidor para leitura/gravação
const char *host = "jsonplaceholder.typicode.com";
const int httpsPort = 443;  //HTTPS= 443 e HTTP = 80

//Impressão digital SHA1 do certificado use o navegador da web para visualizar e copiar
const char fingerprint[] PROGMEM = "B7 CB 1D 1B 02 72 1D 0E 89 A7 94 92 55 38 A7 37 9B 5D CD C4";
//=======================================================================
//                    Power on setup
//=======================================================================

void setup() {
  delay(1000);
  Serial.begin(115200);
  WiFi.mode(WIFI_OFF);        //Evita problemas de reconexão (demora muito para conectar)
  delay(1000);
  WiFi.mode(WIFI_STA);        //Only Station No AP, Esta linha oculta a visualização do ESP como hotspot wifi
  
  WiFi.begin(ssid, password);     //Conecte-se ao seu roteador WiFi
  Serial.println("");

  Serial.print("Connecting");
  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  //Se a conexão for bem-sucedida, mostre o endereço IP no monitor serial
  Serial.println("");
  Serial.print("Conectado a ");
  Serial.println(ssid);
  Serial.print("Endereço de IP:");
  Serial.println(WiFi.localIP());  //Endereço IP atribuído ao seu ESP
}

//=======================================================================
//                    Main Program Loop
//=======================================================================
void loop() {
  WiFiClientSecure httpsClient;    //Declare object of class WiFiClient

  Serial.println(host);

  Serial.printf("Usando impressão digital '%s'\n", fingerprint);
  httpsClient.setFingerprint(fingerprint);
  httpsClient.setTimeout(15000); // 15 Seconds
  delay(1000);
  
  Serial.print("Conexão HTTPS");
  int r=0; //contador de tentativas
  while((!httpsClient.connect(host, httpsPort)) && (r < 30)){
      delay(100);
      Serial.print(".");
      r++;
  }
  if(r==30) {
    Serial.println("Falha na conexão");
  }
  else {
    Serial.println("Conectado à web");
  }
  
  String ADCData, getData, Link;
  int adcvalue=analogRead(A0);  //Leia o valor analógico do LDR
  ADCData = String(adcvalue);   //Conversão de string para inteiro

  //GET Data
  Link = "/comments?postId=" + ADCData;

  Serial.print("URL solicitante: ");
  Serial.println(host+Link);

  httpsClient.print(String("GET ") + Link + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +               
               "Connection: close\r\n\r\n");

  Serial.println("request sent");
                  
  while (httpsClient.connected()) {
    String line = httpsClient.readStringUntil('\n');
    if (line == "\r") {
      Serial.println("headers received");
      break;
    }
  }

  Serial.println("reply was:");
  Serial.println("==========");
  String line;
  while(httpsClient.available()){        
    line = httpsClient.readStringUntil('\n');  //Read Line by Line
    Serial.println(line); //Print response
  }
  Serial.println("==========");
  Serial.println("closing connection");
    
  delay(2000);  //GET dados a cada 2 segundos
}
//=======================================================================

Carregue o código e abra o monitor serial, em caso de algum problema ele mostrará erros.

Poucos problemas e soluções comuns

  1. Não use http ou https na frente da tinta do host
  2. Erro impressão digital não definida Placa de atualização
  3. Erro “-1” Você está tentando se conectar a um site seguro HTTPS.
  4. Erro Falha na conexão Você está usando a porta 80 para HTTPS. HTTPS funciona na PORTA 443