На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > TLS своими руками (без тяжёлых библиотек).
      Пытаюсь написать клиента (си), открывающего соединение с каким-либо HTTPS-сервером без использования SSL-библиотек (типа OpenSSL или MbedTLS).
      Столкнулся с почти полным отсутствием мануалов по этой теме (в деталях, а не на уровне "вызови функцию такой-то либы, она всё сделает").
      Единственное более-менее вменяемое описание, которое удалось найти: The Illustrated TLS Connection
      Сделал, руководствуясь им, работает, но: только до шага "Client handshake finished". Здесь наступил затык. В этом месте описано очень поверхностно. К тому же автор использует TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, который в настоящее время объявлен нерекомендуемым. А я бы хотел что-то умеющее работать с публичными HTTPS-серверами сейчас, а по-возможности - как можно дольше в будущем без переделок.
      Поэтому я решил использовать TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (ну или может быть TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 - его все опробованные сайты выбирают при соединении с текущей версией браузера). Они рекомендуемые сейчас и на будущее.
      Вобщем - все шаги до "Client handshake finished" проходят нормально (тестовые данные совпадают с теми которые в "The Illustrated TLS Connection"). Но на этом шаге на формируемый мной кадр к серверу, сервер отвечает Alert-ом "Bad record MAC". Подозреваю, что я или неправильно понял описание (которого с гулькин нос), или для TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 кадр нужно формировать как-то иначе, чем для TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA.

      RFC всякие по этому делу тоже пытался читать, но там тем более всё описано очень туманно. Без конкретики. Ну или надо перерыть гору материала. А мне нужно всего-лишь как я понимаю - правильно сформировать finished-кадр (расположить нужные данные в нужном порядке до и после шифрования AES128-GCM-SHA256).
      Можно конечно расковырять исходники вышеуказанных библиотек, но это дело очень небыстрое в силу их объёма и запутанности.

      Цель у меня:
      Версия: TLSv1.2
      Соединение с HTTPS-сервером с минимальными требованиями.
      Только один способ шифрования: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
      И один или два алгоритма эллиптических кривых: "secp256r1", "curve25519".
      Проверил множество публичных HTTPS-серверов - все они приняли эти соглашения от моего недоклиента. Значит их вполне достаточно для настоящего времени.

      Собственно - вопрос: Может кто посоветует вменяемый мануал (описание, пошаговое руководство) по TLS-хэндшейку? По шагам, с примерами и не на базе допотопных методов и алгоритмов? А на актуальных сейчас: с эфемерными ключами, на эллиптических кривых или secp256r1, GCM и т.д.?
      Сообщение отредактировано: jcxz -
        Если уж в рфц не нашёл описания, хотя это нонсенс, остаётся только лить сырцы какой-нить опенссл, и собирать с собственным дебагом, ну и пошагово смотреть: кто что как куда и почему.

        Добавлено
        Цитата jcxz @
        Можно конечно расковырять исходники вышеуказанных библиотек, но это дело очень небыстрое в силу их объёма и запутанности.

        Другого варианта не вижу.
          Цитата Gonarh @
          Если уж в рфц не нашёл описания, хотя это нонсенс
          Если знаете где там описано как построить это сообщение ("Client handshake finished") побайтно - просто дайте конкретную ссылку.
          Чтобы там было написано типа: "этот байт кладём сюда, это туда, применяем к данным от смещения X0 до X1 такое-то преобразование, результат его, такого-то размера, кладём в сообщение начиная с байта Y".
            Цитата jcxz @
            Если знаете где там описано как построить это сообщение...

            Вряд ли писатели известных библиотек использовали
            мистику и волшебство. Они наверняка пользовались RFC.
            Ещё можно использовать поиск:
            Отсюда можно начать изучение
            Интересная статья
              Гуглом пользоваться умею. И это:
              Цитата ЫукпШ @
              я тоже читал. Вы сами это почитайте: там более-менее подробно описано только начало хэндшейка, а про его завершение - только общие слова сказаны.
              Сообщение отредактировано: jcxz -
                jcxz
                В свое время я часто находил нужную информацию в области сетевого программирования в группах гугла https://groups.google.com/
                  Цитата Oleg2004 @
                  jcxz В свое время я часто находил нужную информацию в области сетевого программирования в группах гугла

                  Спасибо, но там ничего не было.

                  Вобщем вопрос решён - уже всё работает. :)
                  Поддерживаются только 2 метода:
                  ECDHE_RSA_WITH_AES_128_GCM_SHA256
                  ECDHE_ECDSA_WITH_AES_128_GCM_SHA256

                  этого хватает для подавляющего большинства серверов.
                  И объём исходников == немного больше 100кБ. Всего. :)
                  Сообщение отредактировано: jcxz -
                    Выкладывай на гитхаб, если не проприентарщина и прочая nda :D
                    Сообщение отредактировано: Gonarh -
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0260 ]   [ 16 queries used ]   [ Generated: 29.03.24, 04:42 GMT ]