• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Решено Получить ssl certificate fingerprint of gmail

Здравствуйте, недавно понадобилось получить finggerprint mail.google.com для моего небольшого проекта на esp8266, в интернете нашел только следующий туториал A Beginner's Guide to the ESP8266 Но, для получения fingerprintа по этому туториалу нужно:

To get this fingerprint, execute the following command in a terminal (Linux & Mac): openssl s_client -connect mail.google.com:443 < /dev/null 2>/dev/null | openssl x509 -fingerprint -noout -in /dev/stdin | sed 's/:/ /g'

А у меня windows, и нету доступа к linux / mac, поэтому если кому-то не сложно скопируйте команду в терминал и отправьте мне выведенный fingerprint(как этот D3 90 FC 82 07 E6 0D C2 CE F9 9D 79 7F EC F6 E6 3E CB 8B B3). Или можете предложить другие способы его получить...
 
Спасибо! Там правда немного не в том формате, что мне нужно, но ничего, тоже неплохо. Вообще, в идеале было бы сделать, чтобы esp8266 fingerprint получала сама, программно, потому что gmail fingerprintы примерно раз в две недели меняет, и хотелось бы этот процесс как-то автоматизировать...
 

pvvx

Активный участник сообщества
Спасибо! Там правда немного не в том формате, что мне нужно, но ничего, тоже неплохо. Вообще, в идеале было бы сделать, чтобы esp8266 fingerprint получала сама, программно, потому что gmail fingerprintы примерно раз в две недели меняет, и хотелось бы этот процесс как-то автоматизировать...
Взять другой WiFi-SoC с поддержкой SSL:
Код:
Starting connection to server...
connected to server

CLK CPU         166666666 Hz
RAM heap        2138328 bytes
TCM heap        27920 bytes
HTTP/1.0 401 Unauthorized
Content-Type: text/html; charset=UTF-8
WWW-Authenticate: BASIC realm="mail.google.com"
Date: Fri, 25 Aug 2017 18:47:03 GMT
Expires: Fri, 25 Aug 2017 18:47:03 GMT
Cache-Control: private, max-age=0
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Server: GSE
Alt-Svc: clear
Expect-CT: preload
Accept-Ranges: none
Vary: Accept-Encoding

<HTML>
      <HEAD>
            <TITLE>Unauthorized</TITLE>
                                       </HEAD>
                                              <BODY BGCOLOR="#FFFFFF" TEXT="#000000">
                                                                                     <H1>Unauthorized</H1>
                                                                                                          <H2>Error 401</H2>
                                                                                                                            </BODY>
                                                                                                                                   </HTML>

disconnecting from server.
Не нравиться ему пароль (credentials = "ZW1haWwuYWRkcmVzc0BnbWFpbC5jb206cGFzc3dvcmQ="), указанный в ссылке со скетчем...:(
 

pvvx

Активный участник сообщества
@pvvx, что вы подразумеваете под "Взять другой WiFi-SoC с поддержкой SSL"? Использовать какую-то другую библиотеку под esp8266? Если да, то какую? Кстати GRC | SSL TLS HTTPS Web Server Certificate Fingerprints   показывает md5 fingerprint, а мне нужен sha1... Если честно, я не особо разбираюсь в этой теме, так что простите за глупые вопросы, если что.
 

sharikov

Active member
@pvvx, что вы подразумеваете под "Взять другой WiFi-SoC с поддержкой SSL"? Использовать какую-то другую библиотеку под esp8266?
pvvx подразумевает что для нормальной реализации ssl нужно брать soc с 1-2 мегабайта линейно адресуемой ram. Esp и другим чипам без достаточного объема памяти никакие библиотеки не помогут: ssl требует память хоть тресни.
Дальше будет только хуже: стандарты непрерывно утяжеляются.
 
Подведу кратко мои итоги:
  • В интернете способа получить fingerprint программно я не нашел, но, в любом случае, такой вариант меня бы не устроил, потому-что пример httpsRequest работает, код из A Beginner's Guide to the ESP8266 работает, но в моём итоговом скетче esp8288 не хватает памяти, из-за того, что я еще получаю прогноз на 5 дней с openweathermap.org с большой строкой json, которая тоже занимает много памяти (в итоге я бы хотел получить что-то типа виджета, показывающего прогноз погоды, текущие показания датчиков, количество непрочитанных писем gmail, балл яндекс пробок, и похожую приблуду).
  • Есть еще способ скачать ядро для esp8266 с github, а не из arduino менеджера, и там есть пример HTTPSRequestCACert, но он банально не компилируется...
  • Судя по всему, от esp8266 мне придется отказаться, из-за ее небольшого количества памяти(у меня также есть esp32). Использовать именно esp8266 я хотел потому, что с ней прекрасно работают библиотеки adafruitst7735, adafruitili9341(с добавлением yield, для отключения wdt), а на esp32 мне найти подходящие библиотеки/заставить работать эти пока не удалось.
  • Тем не менее, на esp32 памяти должно хватить, и также для него есть прекрасный пример WifiClientSecure, но там необходимо указать root CA сервера gmail, который я пока тоже не нашел.
  • Поэтому, пока что я хотел бы адаптировать скетч из A Beginner's Guide to the ESP8266 под esp32(в WiFiClientSecure для esp32 нет функции verify).
 

pvvx

Активный участник сообщества
@pvvx, что вы подразумеваете под "Взять другой WiFi-SoC с поддержкой SSL"? Использовать какую-то другую библиотеку под esp8266? Если да, то какую? Кстати GRC | SSL TLS HTTPS Web Server Certificate Fingerprints показывает md5 fingerprint, а мне нужен sha1...
Если упростить, то 128 битное шифрование посчитали ненадежным и весь инет с 2015 года переводится на минимум 256 битное (включая замену алгоритмов соединения). Для этого требуется большие ресурсы у чипа, в частности по объему буферов для дешифровки и т.д. Fingerprint c SHA1 считается устаревшим и не обязательно поддерживается (ну там SHA2 и две подписи ...). В маркетинговых названиях я тоже не силен, т.к. не особо всё это интересно, почитайте какие статьи... На современных WiFi-SoC стоят аппаратные блоки шифрации-дешифрации и обычно применяется либа mbed tls/ssl (polarssl) и никаких fingerprint sha1 не требуется. По RAM mbed tls/ssl, для соединения SSL, требует примерно от 64 килобайт, что ESP8266 не в состоянии обеспечить.
Режим "совместимости" с методами в ESP8266 ещё будет существовать несколько лет, но никто в инете не обязан его поддерживать и к каждому серверу вам придется искать свои подходы, для старого метода SSL соединения.
Для решения и получения устаревшей системы защиты с ESP8266 вам придется ставить своего посредника в сети, переводящего протокол на новую методу...
Подтверждение корневого сертификата с SHA1 устарело, т.к. найдены пути подмены (коллизии и дыры в протоколе), да и 128 бит недостаточно для идентификации, + увеличение скорости оборудования для подбора подмены подписей у желающих :) ... Такие вещи происходят всегда, и все системы "шифрации" периодически должны изменяться (устаревать) и заменяются на новые, с более “тяжёлыми” алгоритмами и длиной ключей...
Если вы хотите создать какую систему с расчетом работы в SSL хотя-бы на пять лет, то на сегодня ESP8266 применять там уже нельзя. Поиграться в SSL в этом году вам ещё хватит, используя всякие кривые пути и оставшуюся поддержку некоторыми глобальными серверами устаревшего оборудования, что уже не сказать о следующем годе. Все эксплореры уже навязчиво орут и не переходят на устаревшие HTTPS без подтверждения пользователя, а завтра и это отключат...
Пишите в Espressif – они обещали “поддержку чипа” в 12 лет :) :) :)
 
Последнее редактирование:
@pvvx,@sharikov, Еще раз спасибо за помощь, теперь я понимаю, что у esp8266 слишком мало ресурсов для защищенных соединений, и, как я написал в предыдущем моем сообщении, я буду использовать esp32(хотя мне еще придется развлекаться с библиотеками для дисплеев).Немножко переделал пример WiFiClientSecure
Код:
#include <WiFiClientSecure.h>

const char* ssid     = "--------";     // your network SSID (name of wifi network)
const char* password = "--------"; // your network password

WiFiClientSecure client;

void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(115200);
  delay(100);

  Serial.print("Attempting to connect to SSID: ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);

  // attempt to connect to Wifi network:
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    // wait 1 second for re-trying
    delay(1000);
  }

  Serial.print("Connected to ");
  Serial.println(ssid);

  Serial.println("\nStarting connection to server...");
  if (!client.connect("mail.google.com", 443))
    Serial.println("Connection failed!");
  else {
    Serial.println("Connected to server!");
    // Make a HTTP request:
   
client.print(String("GET ") + "/mail/feed/atom" + " HTTP/1.1\r\n" +
               "Host: " + "mail.google.com" + "\r\n" +
               "Authorization: Basic " + "CREDENTIALS" + "\r\n" +
               "User-Agent: ESP8266\r\n" +
               "Connection: close\r\n\r\n"); // Send the HTTP request headers

  Serial.println("Request sent");

  while (client.connected()) {                          // Wait for the response. The response is in XML format
    client.readStringUntil('<');                        // read until the first XML tag
    String tagname = client.readStringUntil('>');       // read until the end of this tag to get the tag name
    if (tagname == "fullcount") {                       // if the tag is <fullcount>, the next string will be the number of unread emails
      String unreadStr = client.readStringUntil('<');   // read until the closing tag (</fullcount>)
      int unread = unreadStr.toInt();        
      Serial.println(unread);// convert from String to int
      break;                                            // stop reading
    }                                                   // if the tag is not <fullcount>, repeat and read the next tag
  }

    client.stop();
  }
}

void loop() {
  // do nothing
}
и все прекрасно работает, и не нужно никакого фингерпринта раз в неделю искать. Пока что меня такой вариант устраивает, так что тему действительно можно считать закрытой. Еще раз, всем спасибо за помощь!
 
Сверху Снизу