Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.84] |
|
Сообщ.
#1
,
|
|
|
Пытаюсь написать клиента (си), открывающего соединение с каким-либо 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 и т.д.? |
Сообщ.
#2
,
|
|
|
Если уж в рфц не нашёл описания, хотя это нонсенс, остаётся только лить сырцы какой-нить опенссл, и собирать с собственным дебагом, ну и пошагово смотреть: кто что как куда и почему.
Добавлено Цитата jcxz @ Можно конечно расковырять исходники вышеуказанных библиотек, но это дело очень небыстрое в силу их объёма и запутанности. Другого варианта не вижу. |
Сообщ.
#3
,
|
|
|
Цитата Gonarh @ Если знаете где там описано как построить это сообщение ("Client handshake finished") побайтно - просто дайте конкретную ссылку.Если уж в рфц не нашёл описания, хотя это нонсенс Чтобы там было написано типа: "этот байт кладём сюда, это туда, применяем к данным от смещения X0 до X1 такое-то преобразование, результат его, такого-то размера, кладём в сообщение начиная с байта Y". |
Сообщ.
#4
,
|
|
|
Цитата jcxz @ Если знаете где там описано как построить это сообщение... Вряд ли писатели известных библиотек использовали мистику и волшебство. Они наверняка пользовались RFC. Ещё можно использовать поиск: Отсюда можно начать изучение Интересная статья |
Сообщ.
#5
,
|
|
|
Гуглом пользоваться умею. И это:
я тоже читал. Вы сами это почитайте: там более-менее подробно описано только начало хэндшейка, а про его завершение - только общие слова сказаны. |
Сообщ.
#6
,
|
|
|
jcxz
В свое время я часто находил нужную информацию в области сетевого программирования в группах гугла https://groups.google.com/ |
Сообщ.
#7
,
|
|
|
Цитата Oleg2004 @ jcxz В свое время я часто находил нужную информацию в области сетевого программирования в группах гугла Спасибо, но там ничего не было. Вобщем вопрос решён - уже всё работает. Поддерживаются только 2 метода: ECDHE_RSA_WITH_AES_128_GCM_SHA256 ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 этого хватает для подавляющего большинства серверов. И объём исходников == немного больше 100кБ. Всего. |
Сообщ.
#8
,
|
|
|
Выкладывай на гитхаб, если не проприентарщина и прочая nda
|