Не работает последний эксперемент telegram-bot в йодо интернет вещей

Тема в разделе "Iskra JS, Espruino, Йодо", создана пользователем Сасмин, 4 сен 2019.

  1. Нашел в интернетах www.howsmyssl.com, сходил туда с iskrajs. Эта штука пишет, что клиент поддерживает TLS 1.2. Рядом я нашел аналогичный сайт cc.dcsec.uni-hannover.de, выдающий чуть более подробную инфу. Слева на скрине - результат хождения из браузера, справа - результат хождения из iskrajs.
    upload_2020-5-5_21-1-12.png

    Среди поддерживаемых искрой cipher suites всего ничего наборов алгоритмов:
    • 3d - DH-RSA-MISTY1-SHA - 128 bit
    • 35 - RSA-AES256-SHA - 256 bit
    • 3c - DH-DSS-MISTY1-SHA - 128 bit
    • 2f - RSA-AES128-SHA - 128 bit
    • ff - EMPTY-RENEGOTIATION-INFO-SCSV
    Продолжаю копать в эту сторону.
     
  2. Сконцентрировал внимание на телеге, запукаю бота на iskra, запускаю бота на компе.
    Снял трафик, всё же видимо дело в наборе cipher suites.
    Код (Text):
    Frame 23: 112 bytes on wire (896 bits), 112 bytes captured (896 bits)
    Ethernet II, Src: Espressi_02:2f:e9 (4c:11:ae:02:2f:e9), Dst: Routerbo_12:6e:53 (6c:3b:6b:12:6e:53)
    Internet Protocol Version 4, Src: 192.168.88.10, Dst: 149.154.167.220
    Transmission Control Protocol, Src Port: 22314, Dst Port: 443, Seq: 1, Ack: 1, Len: 58
    Transport Layer Security
        TLSv1.2 Record Layer: Handshake Protocol: Client Hello
            Content Type: Handshake (22)
            Version: TLS 1.0 (0x0301)
            Length: 53
            Handshake Protocol: Client Hello
                Handshake Type: Client Hello (1)
                Length: 49
                Version: TLS 1.2 (0x0303)
                Random: 5df26a03d0eeb92487872d3d7a61254369a38690850b71d7…
                    GMT Unix Time: Dec 12, 2019 21:25:39.000000000 Russia TZ 4 Standard Time
                    Random Bytes: d0eeb92487872d3d7a61254369a38690850b71d7766ff471…
                Session ID Length: 0
                Cipher Suites Length: 10
                Cipher Suites (5 suites)
                    Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA256 (0x003d)
                    Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA (0x0035)
                    Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA256 (0x003c)
                    Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA (0x002f)
                    Cipher Suite: TLS_EMPTY_RENEGOTIATION_INFO_SCSV (0x00ff)
                Compression Methods Length: 1
                Compression Methods (1 method)
                    Compression Method: null (0)
    Код (Text):

    Transport Layer Security
        TLSv1.2 Record Layer: Alert (Level: Fatal, Description: Handshake Failure)
            Content Type: Alert (21)
            Version: TLS 1.2 (0x0303)
            Length: 2
            Alert Message
                Level: Fatal (2)
                Description: Handshake Failure (40)

     

    Комп обращается к тому же узлу, но с другим набором cipher suites, и у него всё норм:
    Код (Text):

    Frame 401: 291 bytes on wire (2328 bits), 291 bytes captured (2328 bits) on interface \Device\NPF_{4DA7A688-151F-4C25-BA1F-8364DCB491DC}, id 0
    Ethernet II, Src: Giga-Byt_70:27:93 (1c:1b:0d:70:27:93), Dst: Routerbo_12:6e:53 (6c:3b:6b:12:6e:53)
    Internet Protocol Version 4, Src: 192.168.88.2, Dst: 149.154.167.220
    Transmission Control Protocol, Src Port: 57325, Dst Port: 443, Seq: 1, Ack: 1, Len: 237
    Transport Layer Security
        TLSv1.2 Record Layer: Handshake Protocol: Client Hello
            Content Type: Handshake (22)
            Version: TLS 1.0 (0x0301)
            Length: 232
            Handshake Protocol: Client Hello
                Handshake Type: Client Hello (1)
                Length: 228
                Version: TLS 1.2 (0x0303)
                Random: bd0b1fdf1e639d79b619d24d58c5bd39adfb7b3ff488bf9a…
                Session ID Length: 0
                Cipher Suites Length: 92
                Cipher Suites (46 suites)
                    Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)
                    Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (0xc02b)
                    Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030)
                    Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 (0xc02c)
                    Cipher Suite: TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 (0x009e)
                    Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (0xc027)
                    Cipher Suite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 (0x0067)
                    Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (0xc028)
                    Cipher Suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 (0x006b)
                    Cipher Suite: TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 (0x00a3)
                    Cipher Suite: TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 (0x009f)
                    Cipher Suite: TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 (0xcca9)
                    Cipher Suite: TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (0xcca8)
                    Cipher Suite: TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (0xccaa)
                    Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 (0xc0af)
                    Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_CCM (0xc0ad)
                    Cipher Suite: TLS_DHE_RSA_WITH_AES_256_CCM_8 (0xc0a3)
                    Cipher Suite: TLS_DHE_RSA_WITH_AES_256_CCM (0xc09f)
                    Cipher Suite: TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 (0x00a2)
                    Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 (0xc0ae)
                    Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_CCM (0xc0ac)
                    Cipher Suite: TLS_DHE_RSA_WITH_AES_128_CCM_8 (0xc0a2)
                    Cipher Suite: TLS_DHE_RSA_WITH_AES_128_CCM (0xc09e)
                    Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 (0xc024)
                    Cipher Suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 (0x006a)
                    Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 (0xc023)
                    Cipher Suite: TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 (0x0040)
                    Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (0xc00a)
                    Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (0xc014)
                    Cipher Suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA (0x0039)
                    Cipher Suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA (0x0038)
                    Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (0xc009)
                    Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (0xc013)
                    Cipher Suite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA (0x0033)
                    Cipher Suite: TLS_DHE_DSS_WITH_AES_128_CBC_SHA (0x0032)
                    Cipher Suite: TLS_RSA_WITH_AES_256_GCM_SHA384 (0x009d)
                    Cipher Suite: TLS_RSA_WITH_AES_256_CCM_8 (0xc0a1)
                    Cipher Suite: TLS_RSA_WITH_AES_256_CCM (0xc09d)
                    Cipher Suite: TLS_RSA_WITH_AES_128_GCM_SHA256 (0x009c)
                    Cipher Suite: TLS_RSA_WITH_AES_128_CCM_8 (0xc0a0)
                    Cipher Suite: TLS_RSA_WITH_AES_128_CCM (0xc09c)
                    Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA256 (0x003d)
                    Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA256 (0x003c)
                    Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA (0x0035)
                    Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA (0x002f)
                    Cipher Suite: TLS_EMPTY_RENEGOTIATION_INFO_SCSV (0x00ff)
                Compression Methods Length: 1
                Compression Methods (1 method)
                Extensions Length: 95
                Extension: server_name (len=21)
                Extension: ec_point_formats (len=4)
                Extension: supported_groups (len=10)
                Extension: session_ticket (len=0)
                Extension: encrypt_then_mac (len=0)
                Extension: extended_master_secret (len=0)
                Extension: signature_algorithms (len=32)

     
    Код (Text):

    Internet Protocol Version 4, Src: 149.154.167.220, Dst: 192.168.88.2
    Transmission Control Protocol, Src Port: 443, Dst Port: 57325, Seq: 1, Ack: 238, Len: 1398
    Transport Layer Security
        TLSv1.2 Record Layer: Handshake Protocol: Server Hello
            Content Type: Handshake (22)
            Version: TLS 1.2 (0x0303)
            Length: 69
            Handshake Protocol: Server Hello
                Handshake Type: Server Hello (2)
                Length: 65
                Version: TLS 1.2 (0x0303)
                Random: 5ae0902ab8cce9faaa89d38b49854dc8eff4f56af6373461…
                    GMT Unix Time: Apr 25, 2018 19:26:50.000000000 Russia TZ 4 Standard Time
                    Random Bytes: b8cce9faaa89d38b49854dc8eff4f56af6373461444f574e…
                Session ID Length: 0
                Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)
                Compression Method: null (0)
                Extensions Length: 25
                Extension: renegotiation_info (len=1)
                    Type: renegotiation_info (65281)
                    Length: 1
                    Renegotiation Info extension
                Extension: server_name (len=0)
                Extension: ec_point_formats (len=4)
                    Type: ec_point_formats (11)
                    Length: 4
                    EC point formats Length: 3
                    Elliptic curves point formats (3)
                        EC point format: uncompressed (0)
                        EC point format: ansiX962_compressed_prime (1)
                        EC point format: ansiX962_compressed_char2 (2)
                Extension: session_ticket (len=0)
                Extension: extended_master_secret (len=0)

     

    Ещё нашел похожий неразрешённый тред на http://forum.espruino.com/conversations/327593/
    Видимо, надо будет небольшой сервис-прокси делать для iskra.
     
    ZAZ-965 нравится это.
  3. ИгорьК

    ИгорьК Гуру

    Это инструмент решения какой-то задачи, или способ провести время?
     
  4. Способ провести время, конечно :)

    В общем, предлагаю такой workaround с нацеливанием на пример из набора йодо.
    Нужен простенький прокси, можно так же на javascript написать.
    Код (Javascript):
    const ws = require('ws');
    const TeleBot = require('telebot');
    const bot = new TeleBot(TELEGRAM_TOKEN);

    bot.on('*', msg => {
        const json = JSON.stringify(msg);
        console.log(`[${wss.clients.size}] clients. Sending ${json}.`)
        wss.clients.forEach(c => c.send(json));
    });

    bot.on(['/start'], msg => {
        const replyMarkup = bot.keyboard([['/TurnOn', '/TurnOff']], {resize: true});
        return bot.sendMessage(msg.from.id, 'Light control.', {replyMarkup});
    });

    bot.start();

    wss = new ws.Server({ port: 8080 });
    wss.on('connection', function connection(ws) {
        ws.on('message', function(message) {
            console.log("Incoming message: " + message)
            const payload = JSON.parse(message);
            if (payload.to && payload.text) {
                return bot.sendMessage(payload.to, payload.text);
            }
        });
    });

    С сервисом-прокси можно руками соединяться по вебсокету:
    Код (Javascript):
    var host = {
      ip: '192.168.88.2',
      port: 8080
    };

    var wsOptions = {
      path: '/',
      port: host.port,
      origin: 'iskrajs',
      keepAlive: 60
    };

    var WebSocket = require("ws");
    var light = require('@amperka/led').connect(P9);

    var wifi = require('@amperka/wifi').setup(function(err) {
      wifi.connect(SSID, PASSWORD, function(e) {
        print('wifi connected');

        var ws = new WebSocket(host.ip, wsOptions);

        ws.on('message', function(msg) {
          var data = JSON.parse(msg);
          var reply = null;

          switch(data.text) {
            case '/TurnOn': {
              light.turnOn();
              reply = 'Light is on.';
              break;
            }
            case '/TurnOff': {
              light.turnOff();
              reply = 'Light is off.';
              break;
            }
          }

          if (reply) {
            ws.send(JSON.stringify({
              to: data.from.id,
              text: reply
            }));
          }
        });

      });
    });

    Тут только остаётся два момента зарешать. По-хорошему нужно обрывы связи между iskra и проксёй предусмотреть (приделать реконнекты) + прокси где-нибудь ещё захостить.
     
  5. ИгорьК

    ИгорьК Гуру

    Известно, что Левша подковал блоху.
    Проблема: нигде в мире так и не нашли второй подкованной. Ибо не за чем.
     
    SergeiL нравится это.
  6. Вопрос "Чтобы что?" - он всегда хорош, не спорю. Но какой смысл его задавать ознакомительному и по большому счёту детскому набору из задачек just-for-fun?

    Вот и ознакомились, что на самом деле текущий wifi-troyka module в половину интернета ходить не может.
    Кажется, это вполне себе ценное знание для тех, кто рассчитывает его у себя применить в более полезном с практической точки зрения проекте.
     
    Последнее редактирование: 10 май 2020
  7. ZAZ-965

    ZAZ-965 Гуру

    Пришел к такому же выводу. Собрал Espruino для Linux - та же ошибка mbedtls_ssl_handshake returned -0x7780
    Код (Bash):

     ____  _
    |  __|___ ___ ___ _ _|_|___ ___
    |  __|_ -| . |  _| | | |  | . |
    |____|___|  _|_| |___|_|_|_|___|
      |_| espruino.com
     2v05.56 (c) 2019 G.Williams

    Espruino is Open Source. Our work is supported
    only by sales of official boards and donations:
    http://espruino.com/Donate

    Uncaught InternalError: Failed! mbedtls_ssl_handshake returned -0x7780
     
     
  8. ИгорьК

    ИгорьК Гуру

    Этот проект пилит всего один человек. А вас уже в два раза больше :)
     
  9. Наша цель - собрать как можно больше инфы, чтобы помочь этому человеку (и другим) в дальнейшем идентифицировать подобные проблемы.
     
    ИгорьК нравится это.
  10. ИгорьК

    ИгорьК Гуру

    У всех свои развлечения :)
    Когда-то тоже развлекался: http://forum.amperka.ru/threads/esp...-мониторинг-и-mqtt-брокер-сигнализация.13672/
     
    Un_ka нравится это.
  11. SergeiL

    SergeiL Оракул Модератор

    А когда добреетесь до результата, плата пошлет сообщение через Телеграмм, что дальше?
    Это я к тому, что тоже возмутился блокировками, поднял по этому поводу сервачек в итальянском ДЦ, настроил из дома маршрутизацию через него на телеграм и несколько других сайтов. (с выходом остального трафика через своего провайдера)
    Все заработало, и как то не интересно стало....:(
    Параллельно раскопал возможность выставлять разные приоритеты сообщений Prowl в OpenHAB.
    В общем не пользуюсь я телеграм, Prowl отлично работает без всех этих телодвижений.
     
  12. ZAZ-965

    ZAZ-965 Гуру

    Вот! Гордон писал, что сил хватает только на поддержку "родных" ESPRUINOBOARD и ESPRUINOWIFI, а для остальных плат ждет помощи сообщества.
    У Espruino весьма старый mbed TLS 2.1.1 released 2015-09-17 - но имеет полный набор Ciphersuites (и я не нашел, что какие-то из них deprecated ), но почему Espruino даже для Linux выбирает ограниченный набор с наскока понять не получилось.
     
    ИгорьК нравится это.
  13. Тоже не понимаю посыла вопроса. Закрою книжечку про йодо-набор и пойду заниматься другими делами?

    Ну да, одну и ту же задачу можно решать разными способами и разными инструментами. Судя по тому, что prowl - это сервис уведомлений, то тут даже и задача другая, т.к. общение идёт в одну сторону.


    Сейчас самая свежая версия TLS - 1.3. Про полный набор не понял - по client hello ведь видно, что поддерживаются всего 4. Cipher suites могут считаться слабыми, поэтому сервер может просто не устанавливать соединения с такими клиентами. Мне интересно, приколочен ли набор поддерживаемых cipher suites к железу, или он пополняется программно. Возможно, набор алгоритмов изначально простенький потому, что более сложные алгоритмы требовательны к железу.
     
  14. SergeiL

    SergeiL Оракул Модератор

    Так и есть, уведомления.
    Для управления есть приложение и на web странице OH.
    Управление через команды, которые вечно пытаешься вспомнить - та еще радость. Проходил на СМС.
     
  15. ИгорьК

    ИгорьК Гуру

    Это намёк. На анекдот про умную японскую пилу и суровых сибирских лесорубов.

    Модуль предназначен для IoT. Вы его тестируете, пожалуй, для других целей.
     
  16. ИгорьК

    ИгорьК Гуру

    Я ни за что не агитирую, но если нужен скриптовый язык - посмотрите в сторону Lua. Проект делает группа людей и только под ESP. (Хотя под вашу задачу, возможно, и здесь не будет решения.)
     
  17. ZAZ-965

    ZAZ-965 Гуру

    @Алексей Смирнов, про полный набор - библиотека mbedtls в Espruino содержит полный набор Cipher suites. Из этого набора при сборке выбирается некое подмножество и линкуется в прошивку (т.е. динамически подгрузить невозможно). А вот с критерием выбора этого подмножества быстро разобраться у меня не получилось.
     
    Алексей Смирнов нравится это.
  18. ИгорьК, отвечу тезизсно, т.к. оказывается некоторые дополнения и примеры появились уже после, и я их не видел.
    Нет, это некорректное сравнение. Корректное такое: покупаешь самолет. На деле оказывается, что летать он может только в хорошую погоду. При этом перспектива такая, что в будущем будет только плохая погода (отказ от старых tls), и поэтому твой самолёт превращается в груду металлолома.

    Пожалуй, нет. Первая буква I в IoT - это Internet. Internet это уже почти равно https. Если модуль не умеет работать с https, то у модуля резко сокращается скоуп применения.

    Очень интересно, как язык повиляет на поддержку cipher suites. На 99% уверен, что никак, поэтому не буду смотреть.

    Давайте не будем превращать в ветку в какие-то непонятные и неконструктивные раздувы про:
    • а зачем тебе это надо
    • это же эксперимент, хаха, оно и не должно работать
    • нет, ты точно делаешь что-то не то, и вообще это всё игрушки непрофильные
    Если нечего добавить про конкретную проблему (недостаток поддерживаемых cipher suites на iskrajs), то предлагаю воздержаться от разных намеков, сказок про левшей и сибирских лесорубов.
     
    ИгорьК нравится это.
  19. ИгорьК

    ИгорьК Гуру

    Ок, вы правы.

    PS. В том смысле, что ваше видение всегда ваше и пересмотреть его или оставить без изменений - ваше право.

    Язык - никак. Я говорил о бОльшей группе людей, работающих над меньшим (два) количеством МК.
     
    Последнее редактирование: 10 май 2020