Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.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 |
Если знаете где там описано как построить это сообщение ("Client handshake finished") побайтно - просто дайте конкретную ссылку. Чтобы там было написано типа: "этот байт кладём сюда, это туда, применяем к данным от смещения X0 до X1 такое-то преобразование, результат его, такого-то размера, кладём в сообщение начиная с байта Y". |
Автор: ЫукпШ 05.08.21, 21:51 |
Вряд ли писатели известных библиотек использовали мистику и волшебство. Они наверняка пользовались 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 |