Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > C/C++: Сетевое программирование > TLS своими руками (без тяжёлых библиотек).


Автор: jcxz 05.08.21, 13:46
Пытаюсь написать клиента (си), открывающего соединение с каким-либо 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 и т.д.?

Автор: Gonarh 05.08.21, 17:08
Если уж в рфц не нашёл описания, хотя это нонсенс, остаётся только лить сырцы какой-нить опенссл, и собирать с собственным дебагом, ну и пошагово смотреть: кто что как куда и почему.

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

Другого варианта не вижу.

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

Автор: ЫукпШ 05.08.21, 21:51
Цитата jcxz @
Если знаете где там описано как построить это сообщение...

Вряд ли писатели известных библиотек использовали
мистику и волшебство. Они наверняка пользовались RFC.
Ещё можно использовать поиск:
Отсюда можно начать изучение
Интересная статья

Автор: jcxz 05.08.21, 22:02
Гуглом пользоваться умею. И это:
я тоже читал. Вы сами это почитайте: там более-менее подробно описано только начало хэндшейка, а про его завершение - только общие слова сказаны.

Автор: Oleg2004 06.08.21, 14:45
jcxz
В свое время я часто находил нужную информацию в области сетевого программирования в группах гугла https://groups.google.com/

Автор: jcxz 21.10.21, 15:37
Цитата Oleg2004 @
jcxz В свое время я часто находил нужную информацию в области сетевого программирования в группах гугла

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

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

этого хватает для подавляющего большинства серверов.
И объём исходников == немного больше 100кБ. Всего. :)

Автор: Gonarh 05.11.21, 18:51
Выкладывай на гитхаб, если не проприентарщина и прочая nda :D

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)