LINUX.ORG.RU

Создать свои сертификаты, подсунуть luci и добавить во все свои браузеры.

Важно: добавление в браузер сертификата, сгенерированного самим luci, проблему не решит, поскольку сертификат самоподписанный (т.е. он один), а браузеры ужесточили правила проверки. Чтобы им угодить, нужна цепочка как минимум из двух сертификатов: корневого (добавляется в браузер) и конечного (подсовывается luci вместе с корневым).

Нагуглить правильное руководство оказалось сложнее, чем я думал. Типичные ошибки в найденных руководствах по созданию сертификатов:

  • Слишком сложно (т.е. лишние действия)
  • Отсутствие команд по созданию корневого CA
  • Создание сертификата без subjectAlternative Name

Как только найду хотя бы одно правильное руководство, добавлю ссылку.

AEP ★★★★★ ()
Ответ на: комментарий от zimipaj

https://gist.githubusercontent.com/sethvargo/81227d2316207b7bd110df328d83fad8/raw/836c5c2650584d3279cb386f17b2a00aa91008fd/create-certs.sh

Правим на предмет req_distinguished_name (оставляем только CN = openwrt), и на предмет alt_names:

[alt_names]
IP.1  = 192.168.1.1
DNS.1 = openwrt
DNS.2 = openwrt.lan

И еще на предмет опции -subj при создании CA-сертификата: -subj "/CN=OpenWRT Router CA/"

Запускаем, добавляем tls/ca.crt в браузер в список доверенных сертификатов. tls/my-service.key копируем на роутер как /etc/uhttpd.key. Затем делаем /etc/uhttpd.crt такой командой:

cat tls/my-service.crt tls/ca.crt

Затем перезапускаем uhttpd и оно должно работать.

AEP ★★★★★ ()
Последнее исправление: AEP (всего исправлений: 1)
Ответ на: комментарий от zimipaj

Ошибка возникла при редактировании. Похоже, при редактировании вставлена пустая строка, или в конце строки удален символ «\». Попробуй оригинальный скрипт без редактирования, потом понемножку правь, между правками удаляй каталог tls.

AEP ★★★★★ ()
Последнее исправление: AEP (всего исправлений: 1)
Ответ на: комментарий от AEP

Разобрался. Теперь другая проблема: импортирую ca.crt в браузер и он выдает «Установка этого личного сертификата не может быть произведена, так как вы не владеете соответствующим закрытым ключом, созданным при выработке запроса на сертификат.»

zimipaj ()
Ответ на: комментарий от zeleni

Теоретически, да. На практике именно с OpenWRT не проверял.

Для этого нужно свое доменное имя, и еще нужен динамический DNS-хостинг, позволяющий создавать TXT-записи, начинающиеся с подчеркивания, и поддерживаемый в каком-нибудь клиенте Let’s Encrypt. Точно подходит Amazon Route53. Из бесплатных могу порекомендовать dynv6.com, но там нет скриптов-хуков, т.е. придется раз в 70 дней переделывать сертификат вручную.

Регистрируем и оплачиваем реальное доменное имя (ну или получаем что-нибудь типа zeleni.dynv6.net бесплатно), если требуется - делегируем на нужный DNS-хостинг. Создаем A-запись, сопоставляющую имени openwrt.zeleni.dynv6.net адрес 192.168.1.1.

Ставим на компьютер какой-нибудь клиент Let’s Encrypt. Официальный certbot при использовании в ручном режиме вполне сойдет, но вообще для выписывания сертификатов я предпочитаю Dehydrated, так как он проще. Вот только с dynv6.com он тоже работает только с «ручным» плугином.

С использованием авторизации через DNS-запись, выписываем сертификат на openwrt.zeleni.dynv6.net или даже на *.zeleni.dynv6.net. Копируем на роутер. Перенастраиваем uhttpd. Готово, теперь openwrt.zeleni.dynv6.net - это роутер, и там валидный сертификат. Валидного сертификата на 192.168.1.1 не будет.

Грабли такие: без интернета доменное имя не будет доступно. Поэтому надо в настройках Network > DNS and DHCP > Local domain прописать zeleni.dynv6.net.

Еще в стандартных репозиториях OpenWRT в снапшотах есть пакет luci-app-acme. Но он несколько под другой случай - а именно, когда у вас белый IP, уже есть доменное имя (возможно, от dynv6), и вам не жалко выставлять uhttpd и luci прямо в интернет слушать на 0.0.0.0. Тогда проверка через webroot тоже сработает. Но мне жалко. Под этот случай см. https://mcgrog.blogspot.com/2018/03/openwrt-letsencrypt.html

AEP ★★★★★ ()