- PVSM.RU - https://www.pvsm.ru -

DD-WRT и сертификаты SSL

Всем привет!

В этой публикации я расскажу о некоторых неочевидных моментах при использовании DD-WRT на вашем роутере. Наверное, завсегдатаям DD-WRT тут будет все очевидно, но тем, кто ставит в первый раз будет много полезного.

Для того, чтобы осуществить всё описанное, нам понадобиться роутер, который поддерживается DD-WRT, компьютер с ОС Linux с любым более или менее современным дистрибутивом (у меня Debian Wheezy) и жажда новых знаний.

Итак, дошли у меня наконец руки водрузить на мой уже довольно старенький LinkSys E4200 прошивку от DD-WRT. К старой оригинальной прошивке от LinkSys было много претензий. В частности:

1) Работала не со всем USB Mass Storage;
2) Жутчайшие, дикие тормоза WebUI при заходе через HTTPS;
3) Постоянная ругань браузеров на сертификат SSL, который похоже генерился каждую новую сессию. Поэтому добавление исключений не работало;
4) Отстутствие локального DNS;
5) Ну и множество других глюков.

В общем, одним воскресным вечером я решил залить DD-WRT. Сделал всё как рассказано в Wiki по моему роутеру, то есть залил сначала mini версию, потом проапдейтил до mega. Сами билды были взяты со странички Router Database, то есть сборка 21061.

Обнаружил следующие косяки:

1) Chrome 39 отказывался посещать роутер через HTTPS;
2) У Firefox 33 тоже возникли какие-то странные проблемы с HTTPS;
3) Новый IE отказывался делать для самоподписного сертификата исключение;
4) Chromium 38 также отказался посещать роутер через HTTPS;
5) Не работал SSH. При попытке входа получал ответ «Connection was closed by 192.168.1.1»

В общем, успешно посетить роутер с помощью HTTPS удалось только лишь с помощью Konqueror.

Дальнейшее ковыряние выявило следующую проблему: web-сервер роутера не умел TLS1. А в новых версиях браузеров, в связи с обнаруженной некоторое время назад уязвимостью SSL3 POODLE, SSL3 похоже отключено начисто. На Linux'овом Chromium я запретил его сам.

Кроме того, использование HTTPS «из коробки» DD-WRT весьма странно, так как сам ключ хранится в прошивке в открытом виде (далее мы это увидим воочию), что в общем-то сводит на нет всю нужду HTTPS.

Итак, первое, что надо знать при использовании DD-WRT: наплюйте на ту версию прошивки, которую вам предлагает Router Database. Вместо этого найдите более свежую сборку под ваш роутер тут [1].

Обновив версию до последней, я решил сразу две проблемы:

1) SSH заработал. Оказывается он был сломан в изначальном билде;
2) Web-сервер роутера стал поддерживать TLS 1.2, что позволило заходить на него уже всеми браузерами, кроме Firefox 33 (хотя это вылечили в 34) и IE и Chrome под виндой, хотя и это лечится путем настройки виндовых политик, а именно отключением запрета на игнорирование проблем сертификатов сайтов.

Осталась только одна проблема небезопасный сертификат в прошивке. Чтобы её вылечить нам придется разобрать прошивку по файликам, подменить в ней сертификат и ключ, и собрать прошивку обратно в один файл. Мы не будем компилировать прошивку из исходников.

Для наших целей есть прекрасная утилита под названием Firmware Modification Kit, скачать её исходники можно здесь [2]. Утилиту нужно собрать стандартной последовательностью команд:

$ ./configure
$ make

Далее в директории с firmware-mod-kit имеются два скрипта: extract-firmware.sh и build-firmware.sh. Запускаем:
$ extract-firmware.sh ~/Downloads/dd-wrt.v24-25408_NEWD-2_K2.6_mega-nv60k.bin
Понятно, что здесь указывается файл вашей прошивки. Она распаковывает прошивку в директорию fmk.

Далее заходим в директорию fmk/rootfs/etc и воочию наблюдаем сертификат cert.pem, который предъявляет роутер при заходе по HTTPS и ключ от него key.pem, который хранится в открытом виде. Есть файлик privkey.pem — это тот же key.pem зашифрованный паролем «pass:password». И это доступно любому, кто скачает эту прошивку.

Итак, наша задача — сгенерировать свой собственный ключ и сертификат. Я сделал так: сгенерировал собственный Certificate Authority (CA) — он мне ещё понадобится при настройке OpenVPN на этом же роутере. Далее, я сгенерировал пару ключ/запрос сертификата и для Web-сервера роутера и подписал его моим CA, полученный сертификат и ключ положил в указанное место прошивки. А свой Certificate Authority я добавил как доверенное на всех своих компах.

Чтобы не писать два раза то, как это делать, я сошлюсь на замечательную статью [3] на Хабре по поводу деятельности с CA и сертификатами. Отмечу лишь два важных момента:
1) в комментариях к этой статье есть описание того, как сгенерировать сертификат на несколько доменов или IP-адресов. Я сгенерировал сертификат на адрес 192.168.1.1, на домен amber.loc (так у меня называется роутер внутри локалки), на внешний IP-адрес (если он у вас есть) и на внешнее DNS-имя (можно взять динамическое DNS-имя).
2) сгенерированный ключ надо делать без пароля. *Paranoid mode ON* После создания и заливки прошивки уничтожить и ключ, и сам файл прошивки. *Paranoid mode OFF*. Запароленный ключ privkey.pem, лежащий в прошивке, никак не используется.

После того, как вы заменили указанные файлы в прошивке, запускаем скрипт:
$ ./build-firmware.sh fmk/
и получаем в директории fmk новую прошивку new-firmware.bin, которую и заливаем на роутер.

Вот и всё.

Автор: dmitrmax

Источник [4]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/kriptografiya/75422

Ссылки в тексте:

[1] тут: http://dd-wrt.com/site/support/other-downloads?path=others%2Feko%2FBrainSlayer-V24-preSP2%2F

[2] здесь: https://code.google.com/p/firmware-mod-kit/

[3] статью: http://habrahabr.ru/post/192446/

[4] Источник: http://habrahabr.ru/post/244105/