Вопрос или проблема
Я пишу небольшой клиент WebRTC как хобби, и сейчас застрял на реализации DTLS, не могу разобраться, что не так с рукопожатием DTLS. Я пытаюсь установить p2p соединение WebRTC между своей реализацией WebRTC и реализацией Gstreamer.
Я отправляю клиентское приветствие как клиент DTLS клиенту gstreamer, он отвечает серверным приветствием, сертификатом ключа и … Затем я отвечаю сообщениями FLIGHT 4, как показано на диаграмме ниже, но я не получаю ответа на flight 5 от Gstreamer.
(я прикрепил pcap файла wireshark и логи Gstreamer) Возможно, что-то не так с flight 4, который я отправляю, но я не могу разобраться с проблемой, я подтвердил, что все сообщения правильные, вручную вычисляя все от premaster secret, master secret, RSA AES …
Я реализовал TLS_RSA_WITH_AES_128_CBC_SHA
premaster secret: FEFD9E38B76CF5780B6C58CBB55309C1C08EE1B5DF7D4507159115A8D459C35936FEEC2344698CF4A7F0689714C0BA19
client random: 39623565396565382d333032332d343865642d383064392d6432346165616538
server random: a9dbe285e2ef980972812e45c86f6aaff1d486212bbb2d93744d2bae14813ae3
ОТПРАВКА зашифрованного PREMSATER KEY НА СЕРВЕР:
не зашифрованный дополненный premaster ключ
0225E7E44EF4694A39D4F4C458DC604DFBD806F2DB0FEF4136FC14FBC827541525900DACB6CEACE1679886270CEF2D9DEEEB05BB773A579B98718DD798DE2A1BE049C869201E9480C521691B25629D1D76C08BE92A7F99718720BBB2CC9BFA151E060BEFDF9BDDAC22B601557FC97E65A583D889A65A28EB2C22717AC2FEC6D82277D6F9E6FFD7F7A216EC4783E4F38E8C0EA393B4080D1FC73D8ED526EBC7466173563CC2B668E12104D85210246CE50A90D689238260FD7ACF9342DC4DDEC0BBDC7884FAB521DEE2DABF8DBAF300FEFD369DD3FE67938055892D6CF4C910C6A06F68524FAF557A087C22CEAAFD53038168EF713C58591157CD6F943FE6E
модуль и экспонента открытого ключа сервера
модуль 8F207DA9E4D246C1C5D002C38C5983CDB0A8C86C8DDE6E7D2249BB1EC85F15CAEA4A0E4EC2EFEBF45A6CCCB1733E208D2852A986F458D60A14E386B6D35717B8C770957B9AD92ED44E19DA73F7626DA8E3329785137044AB8EE89D34F0A3BDE27E2E892BC78AAD904C038F6BCD1AAFA96E7808B0950423B0FDD26720EF2561F779C8309DDA5A6980823E0B1C03B3171E7C63997B606DB1E5BF64F6ABB72D2BBFCE1694CEA9B31D976163ECB3EDB4AB471D187C69FCAA0194A94F969DDD9BA2E59A1618FF1DCBC2C71062FF95DDD6CDEAEC0581D3FA685542DE68DA13E51B38EB8C74A69DADCD94287DC422ABF5FB7488E8122FC3FEC227BE0BA5A4A5874DA84D
зашифрованный premaster ключ:
0194DF7D60F9992D633617A3D3E66F828D9D18ACEC75778808066A17A6F2625761901FF3C88970C588060358551F7B9F65DD6DC510525487C10A85FFCE33962C719113B18FF1D197CF96889E2A8348A0135939E139CEB5BCD6D9FF9D707604B455119AA97C4ADB1EBEF84101D7B1B9860241FF601DE4FDC79DB4901A1F43E71942E5044828D5106862B1FEDE79F1F928B05C55EDD796AD0F5BC6C56BC8386FA4F331B8292A4C5FEB9D98D087D2DC34AD1CF608FE40BDACAB8B679CEE40863E65E8687C90F73BB8C61530CD19CD58C63A1ABFAB7F2E9BA400210C22EB16F3BA57291EF53B2BC28B33B9817AB5CDE7559BB957470252B29E2434DBB264EB39117A
экспонента: 010001
Я зашифровал сообщение выше с использованием модуля и экспоненты сертификата моего сервера и отправил его в сообщении обмена ключами.
ПОЛУЧЕНИЕ MASTER SECRET ИЗ PREMASTER SECRET:
Результат prf для master secret
991FE0D757F2E3422CB36B287974B8F1CFEA6EA464674D8CCCCA9111AF817BA0934F07F7F376B5ED1F507F7575A7CA03
расширение ключа для получения ключевого материала
b2693e4352ac4a9669d92b4ba2a3153a9556b3ff82a347a85713bb4864e8d3cfbed57e8c60f6965cfc10b7c85a88934fa83fe883ee02f1a4fd6392045b87d38775c5e059f75613fefa3208b78d0b61f0245fcc6e10d68c56ab661da1641d132cb0a71ce0fd074cf6149826dbdd70bfc8d6139fccbdbe3182ad80bba13254339d
полученные ключи:
AES CLIENT key: 88 04 d7 e0 41 c1 5a b4 3a f7 7f 40 d9 fd 0d 13
AES CLIENT IV: 3a f3 3d 4c 30 57 14 6a 22 50 c7 56 97 c3 75 f7
Я использую вышеуказанные ключи для шифрования сообщения завершения с помощью aes cbc и отправляю его.
не зашифрованное сообщение завершения с дополнением
14 00 00 0c 00 00 00 00 00 00 00 0c ad f8 6f 17 16 a9 3f df 10 b9 c1 9b ca d1 f7 d2 21 58 97 26 72 08 15 bb d8 f0 61 81 49 4e 79 69 03 03 03 03
Ответ или решение
Необходимость тщательной проверки каждой части процесса DTLS-рукопожатия, вероятно, является ключевым моментом при решении вашей проблемы. Основываясь на ваших данных и описании, давайте рассмотрим возможные источники проблем.
-
Проверка Flight 4: Обратим внимание на структуру передаваемого вами сообщения в рамках Flight 4. Возможно, проблема заключается в неверной форме либо в последовательности полей, которые вы отправляете. Убедитесь, что все поля сообщения соответствуют спецификациям DTLS и содержат необходимую информацию. Конкретно проверьте:
- Версия протокола
- Номер сообщения
- Данные о сертификате
- Правильность шифрования и порядка шифровальных параметров
-
Логирование и анализ GStreamer: В вашем сообщении указано на наличие логов GStreamer. Попробуйте внимательно проанализировать логи GStreamer на предмет ошибок или предупреждений, которые могут предоставить подсказки о том, что принимающая сторона не обрабатывает ваш запрос правильно. Вам следует искать сообщения, связанные с получением и обработкой ваших DTLS-сообщений.
-
Wireshark и захваченные пакеты: Анализируйте захваченные пакеты в Wireshark, обращая внимание на:
- Статусы возвращаемых пакетов
- Соответствие между вашими отправленными и принятыми пакетами
- Ошибки протоколов, которые могут быть указаны в деталях пакетов (например, возможно, сервер не может обработать ваш Finish message).
-
Проверка шифрования и ключей: Вы уже предоставили исчерпывающие данные о вашем процессе шифрования и производстве ключей. Проблемы могут возникнуть из-за:
- Неверного алгоритма или параметров для AES (проверьте, соответствует ли он ожиданиям GStreamer)
- Неправильного использования векторов инициализации (IV)
- Неправильного заполнения или выравнивания, которые могут исказить шифрованный финальный сообщение.
-
Временные задержки и тайм-ауты: Иногда проблема может заключаться в сетевых задержках или тайм-ауте соединения. Убедитесь, что все сообщения от клиента до сервера доходят и что сервер успевает на них реагировать.
-
Соблюдение стандартов: Убедитесь, что реализация соответствует всем спецификациям DTLS и RFC 6347. Различия в реализации могут привести к несовместимостям, особенно в обработке сообщений и валидации сертификатов.
- Отладочная информация: Включите все возможные отладочные сообщения как на стороне клиента, так и на стороне GStreamer и внимательно за ними следите в ходе рукопожатия. Это поможет выявить, на каком этапе происходит сбой.
Попробуйте выполнить эти рекомендации и повторно протестируйте соединение. Удачи в решении проблемы!