Для HTTPS вам нужен TLS сертификат. По умолчанию OpenWrt генерирует его (самоподписанный). Вы можете открыть Luci по HTTPS URL-адресу. Но ваш браузер будет жаловаться на то, что сертификат самоподписанный и мы не можем знать, если сертификат не был подделан злоумышленником посередине.

Вы можете сгенерировать (“выпустить”) TLS сертификат на устройстве и попросить Удостоверяющий Центр (УЦ) (Certificate Authority, CA) подписать его, чтобы браузеры принимали его без предупреждения. LetsEncrypt и ZeroSSL являются двумя УЦ, которые позволяют сделать это бесплатно и автоматически, используя протокол проверки ACME. Вам понадобится клиент ACME, то есть установленный и сконфигурированный acme.sh, который выпустит сертификата и будет обновлять его каждые 3 месяца. Сам acme.sh использует ZeroSSL по умолчанию начиная с версии 3 от Августа 2021, но пакет OpenWrt не последовал за его изменениями и по умолчанию по-прежнему использует LetsEncrypt.

Вы должны понимать ACME Challenge виды проверки. Короче говоря, УЦ (т.е. LetsEncrypt, ZeroSSL) необходимо убедиться, что вы владеете доменом, для которого вы пытаетесь выпустить сертификат. Таким образом, УЦ генерирует случайный токен который должен либо

  • Добавлен в TXT запись домена через API провайдера DNS. Эта проверка называется DNS-01.
  • Размещён как файл в специальной папку на веб-сервере доступную извне, например http://YOUR_DOMAIN/.well-known/acme-challenge/TOKEN. Эта проверка называется HTTP-01.

Затем УЦ будет проверять, доступен ли токен и тем самым подтверждает, что вы контролируете сам сервер.

Если вы используете DDNS динамический DNS, то лучше использовать DNS-01 потому что у вас уже есть АПИ пароль на устройстве для обновления DNS записей.

Если вы делаете ваш роутер публичным или вы собираетесь использовать проверку HTTP-01 с помощью Webroot или Standalone метода, тогда вам нужно разрешить доступ из интернета. Протоколу ACME требуется HTTP порт 80 для проверки, но для Webroot вам лучше включить перенаправление на HTTPS, так что порт 443 тоже должен быть открыт.

Если вы хотите иметь действительный сертификат на домен, не открывая доступ ко всему интернету, то единственным вариантом для вас является проверка через DNS. Но не у всех DNS провайдеров есть API для этого, или вы должны указать пароль с полной панели администратора, что неприемлемо с точки зрения безопасности.

Для OpenWrt доступны несколько ACME клиентов: acme.sh, uacme, certbot. В настоящее время acme.sh лучше поддерживается и пакет acme установит его.

Начиная с версии 4.0.0 (Август 2022) пакет acme был реорганизован и теперь у нас есть несколько пакетов:

  • acme-common, который обеспечивает UCI конфигурацию в /etc/config/acme
  • acme-acmesh, который содержит скрипт acme.sh
  • acme-acmesh-dnsapi, который содержит дополнительные скрипты acme.sh для использования проверки через DNS.

Был PR для добавления пакета acme-uacme, но ему не хватало интереса. В будущем мы можем иметь больше ACME клиентов.

Теперь пакет acme пуст и стал переходным виртуальным пакетом устанавливающим acme-common и acme-acmesh.

В “acme” версии 4 также произошло ломающее изменение. Автоматическое установка сертификата для Luci было удалено. Теперь вы должны настроить сертификаты вручную, вы можете попробовать Luci приложение luci-app-uhttpd чтобы указать путь к сертификату. Старые параметры, такие как update_uhttpd и update_nginx удалены.

Панель администратора Luci имеет приложения которые могут быть установлены для расширения GUI с дополнительными страницами настроек. luci-app-acme предоставляет графический интерфейс для настройки выпуска сертификатов.

Откройте панель LUCI, затем в главном меню перейдите по ссылке Система -> Менеджер пакетов. Затем нажмите на “Обновить списки...” для загрузки списка доступных пакетов. Введите имя пакета luci-app-acme в поле поиска “Фильтр”, и нажмите Ввод. Нажмите на кнопку установки. Через зависимости это установит пакеты acme и acme-common и acme-acmesh. Если вы собираетесь использовать проверку через DNS, то также установите acme-acmesh-dnsapi.

Для настройки в LUCI из главного меню откройте Сервисы -> ACME сертификаты.

Основные настройки:

  • “Email учётной записи”: введите ваш адрес электронной почты чтобы получать уведомления об истечении срока действия когда ваш сертификату предстоит обновляться.
  • Вы увидите два предварительно настроенных, но отключен EXAMPLE доменов. Но мы сделаем новый для себя.
  • В нижней части найдите поле для конфигурации нового домена, введите свой домен с подчеркиванием вместо точки, например example_com и нажмите “Добавить”.
  • Будет добавлен новый раздел конфигурации. Теперь давайте отредактируем его.
  • Отметьте флажок “Включено”.
  • “Доменные имена”: добавьте ваш домен example.com. Если вам нужен сертификат на все поддомены (wildcard), добавьте *.example.com (требуется проверка через DNS).
  • Переключитесь на вкладку “Проверка” и выберите “Метод проверки”:
    • Если ваш веб-сервер публичный то выберите “Webroot”. Путь к webroot по умолчанию: /var/run/acme/challenge/. Подробнее см. ниже.
    • Если вам нужен сертификат на все поддомены (wildcard), например *.example.com или у вас нет публичного веб-сервера, то единственная опция - проверка через “DNS” и вам необходимо настроить DNS API.
    • Если у вас нет веб-сервера или нет доступа к нему из интернета, вы можете воспользоваться режимом “Автономный”.
  • Нажмите “Сохранить и Применить”.

Через минуту сертификат уже должен быть сгенерирован. Журнал логов можно посмотреть в Статус -> Системный журнал.

Если возникла какая-либо ошибка, то исправьте её и перезапустите сервис acme чтобы начался выпуск сертификата Перейдите в Система -> Автозапуск, найдите сервис acme и нажмите кнопку “Перезапустить”.

Для опытных пользователей это может быть более предпочтительным, чем графический интерфейс.

Шаг 1: Установите пакеты Используйте командную строку и выполните opkg install acme. Если вы хотите использовать проверку сертификатов через DNS, также установите скрипты для DNS провайдеров: opkg install acme-acmesh-dnsapi

Шаг 2: Конфигурация acme.sh Измените /etc/config/acme для настройки личного адреса электронной почты, доменного имени и метода проверки. Для проверки Webroot используйте option validation_method 'webroot'.

Если у вас установлена версия acme-common старее версии 1.4 (Май 2024), то вам придётся сначала создать символьную ссылку:

mkdir /www/.well-known/
ln -s /var/run/acme/challenge/ /www/.well-known/acme-challenge

Смотрите следующий раздел с подробностями.

Для проверки через DNS используйте option validation_method 'dns.

Например, если вы используете DuckDNS.org DDNS провайдер и хотите получить wildcard сертификат для всех поддоменов *.example.duckdns.org тогда установите пакет acme-acmesh-dnsapi и настройте acme так:

config acme
        option account_email 'ваша_почта@example.com'

config cert 'example_duckdns_wildcard'
        option enabled '1'
        option validation_method 'dns'
        option dns 'dns_duckdns'
        list credentials 'DuckDNS_Token="ВАШ ТОКЕН"'
        list domains 'example.duckdns.org'
        list domains '*.example.duckdns.org'

Смотрите Acme.sh DNS API: DuckDNS.org .

Шаг 3: Выпустите вам сертификат, перезапустив acme сервис с помощью /etc/init.d/acme restart. Это может занять некоторое время. Можно читать журналы с помощью logread -e acme. В случае проблем попробуйте включить опцию debug 1, которая будет выводить больше информации.

При использовании проверки webroot клиент сохраняет проверочный файл в папку (называемую “webroot”), которая доступна из Интернета и Удостоверяющий Центр (т.е. LetsEncrypt, ZeroSSL) проверяет эти файлы сайта по адресу http://example.com/.well-known/acme-challenge/. Это позволяет УЦ убедиться что у вас есть доступ к настройкам домена.

В acme.sh есть опция -w чтобы указать путь к папке webroot, и также в UCI конфиге в /etc/config/acme, есть такая опция. Проблема в том, что вы всегда должны менять место расположения файлов вашего сайта, например /www/.well-known/acme-challenge/. Создание файлов на диске может в конечном итоге разрушить NAND Flash, но также папка может быть только для чтения.

Начиная с версии 4.0.0 (Август 2022) скрипт acme теперь всегда использует одну и ту же папку /var/run/acme/challenge/ для webroot. Папка находится в памяти и путь всегда совпадает, поэтому опция конфигурации webroot больше не требуется и является устаревшей.

Вместо этого вы можете создать символьную ссылку:

mkdir /www/.well-known/
ln -s /var/run/acme/challenge/ /www/.well-known/acme-challenge

Теперь проверьте, доступно ли эта папка из Интернета:

mkdir -p /var/run/acme/challenge/
echo Hi > /var/run/acme/challenge/README.txt
# откройте в браузере или запросите через wget
wget -qO - http://example.com/.well-known/acme-challenge/README.txt

После acme-common версии 1.4 (Май 2024) при установке автоматически создается символьная ссылка. Но вы можете иметь другие папки с http документами, поэтому создайте символьную ссылку самостоятельно.

Надеюсь, что веб-серверы OpenWrt по умолчанию будут отображать папку /var/run/acme/challenge/ в поле /.well-known/acme-challenge/. Поэтому никаких дополнительных символьных ссылок не будет требоваться.

После этого сертификаты можно найти в папке /etc/ssl/acme/ н.п.:

  • /etc/ssl/acme/*.example.com.key приватный ключ TLS. Никогда не показывайте его никому!
  • /etc/ssl/acme/*.example.com.fullchain.crt сертификат TLS и цепочка УЦ, которые подписали его.

Подробная конфигурация сертификатов хранится в /etc/acme/.

Вы можете использовать их в uhttpd, lighttpd, nginx, EmailRelay и любом другом сервере, для которого вы хотите настроить TLS.

Автономный режим (Standalone) предназначен для использования в том случае, если у вас нет веб-сервера (например, только email сервер) или он не доступен для публичного доступа из Интернета. Запускать socat, который будет имитировать временный веб-сервер, чтобы вернуть файл с проверочным значением ACME вызова УЦ (т.е. LetsEncrypt) чтобы убедиться что вы действительно контролируете сервер и домен. Этот сервер должен быть общедоступным, так что вам придется перенаправить внешний порт WAN 80 на него. Тем не менее, по умолчанию этот сервер прослушивает порт 80, который может конфликтовать с uhttpd который по умолчанию тоже прослушивает порт 80 на всех интерфейсах и IP адресах. изменить порт прослушивания на что-то вроде 8080, изменив значение Le_HTTPPort в /usr/lib/acme/acme.sh, или передав его аргументом --httpport. Затем необходимо перенаправить WAN порт 80 (внешний порт остаётся прежним) к порту устройства 8080. Смотрите Безопасный доступ к веб-интерфейсу LuCI для получения более подробной информации об изменении порта.

Когда сертификат выпущен или продлён acme OpenWrt вызывает hotplug хуки в /etc/hotplug.d/acme/ с $ACTION соответственно issued или renewed. Затем также отправляет UBUS событие acme.issue и acme.renew.

Сервисы uhttpd, nginx, haproxy прослушивает событие UBUS acme.renew и выполняют перезагрузку сервиса при обновлении сертификата. Поэтому никаких дополнительных хуков для развертывания не требуется. Просто укажите правильный путь к сертификату.

Но перезагрузка вызывается только при обновлении сертификата. Так что вам нужно выпустить сертификат, затем настроить путь к нему в конфигурации uhttpd/nginx/haprox/, а затем перезапустить службу.

Но другие веб серверы, такие как Apache и Lighttpd не имеют такого триггера перезагрузки.

Вы можете попробовать добавить скрипт hotplug самостоятельно:

Создайте файл /etc/hotplug.d/acme/00-apache с таким внутри:

/etc/hotplug.d/acme/00-apache
if [ "$ACTION" = "renewed" ]; then
	/etc/init.d/apache reload
fi

Внимание: вызов /etc/init.d/apache reload непосредственно в hotplug скрипте может непреднамеренно запустить остановленный сервис.

Имя Тип Обязательно По умолчанию Описание
account_email строка да Email адрес ассоциируется с ключом аккаунта. Если сертификат не был продлён вовремя, вы получите уведомление за 20 дней до истечения срока действия.
debug булево нет 0 Установите в 1 чтобы включить отладочный режим в журнале
state_dir строка нет /etc/ssl/acme Устарело. Теперь неизменяемо. Папка состояния ACME.sh, в которой хранятся данные учетной записи. Для сгенерированных сертификатов будут сделаны символические ссылки в /etc/ssl/acme/
Имя Тип Обязательно По умолчанию Описание
enabled булево нет 1 Включить выпуск сертификатов для этих доменов
staging булево нет 0 Получить сертификат с тестового сервера LetsEncrypt (используйте для тестирования; сертификат будет недействителен).
domains список да Доменные имена которые включить в сертификат. Первое доменное имя будет Субъектом сертификата, последующие доменные имена будут Альтернативными именами.
validation_method строка да Способ проверки: dns, webroot или standalone. Автономный режим будет использовать встроенный веб-сервер acme.sh для выпуска сертификата. Режим Webroot будет использовать существующий веб-сервер для выпуска сертификата. DNS режим позволит вам использовать DNS API вашего DNS провайдера для выпуска сертификата.
dns строка да для dns режима тип DNS API. Смотрите acme.sh wiki: DNS API для просмотра списка доступных API. В режиме DNS доменное имя не обязано быть направлено на IP роутера. Проверка через DNS также является единственным режимом, поддерживающим wildcard сертификаты для всех поддоменов. Для использования этого режима требуется установить пакет acme-dnsapi.
dns_wait целое нет Секунды ожидания пока обновиться DNS записи перед продолжением проверки. Смотрите acme.sh wiki: dnssleep
credentials список да для dns режима Учётные данные для DNS API выбранного выше. Смотрите acme.sh wiki: DNS API для учетных данных, необходимых каждому API. Добавляйте несколько записей в формате КЛЮЧ=ЗНАЧЕНИЕ, чтобы передать несколько переменных учётных данных.
calias строка нет Проверочный алиас. Задайте проверочный алиас который использовать для ВСЕХ доменов. Смотрите acme.sh wiki: DNS Alias Mode для подробностей об этом процессе. LUCI поддерживает только один проверочный алиас для каждого сертификата.
dalias строка нет Алиас домена. Алиас домена для ВСЕХ доменов. Смотрите acme.sh wiki: DNS Alias Mode для подробностей об этом процессе. LUCI поддерживает только один проверочный домен для каждого сертификата.
webroot строка нет /var/run/acme/challenge Устарело. Корневой каталог веб-сервера. Установите эту опцию в корневой каталог веб-сервера для запуска Acme в режиме webroot. Веб-сервер должен быть доступен из Интернета по порту 80.
key_type строка нет ec256 Размер ключа (и тип) для генерируемого сертификата. rsa2048, rsa3072, rsa4096, ec256, ec384
keylength строка нет Устарело. Используйте key_type вместо. Длина ключа RSA в битах.
acme_server строка нет letsencrypt URL УЦ сервера для ACME. Смотрите acme.sh wiki: servers.
standalone булево нет 0 Устарело. Вместо этого используйте option validation_method 'standalone'.
days целое нет 60 Дней до продления
update_uhttp булево нет 0 Удалено из acme v4.0.0. После выпуска сертификата настройте через UCI uhttpd main раздел (т.е. Luci) для использования нового сертификата. Т.е. установить UCI uhttpd.main.key и uhttpd.main.cert. Затем перезагрузить сервис uhttpd. Обновите конфигурацию uhttpd с этим сертификатом после его выпуска (выберите только для одного сертификата). Также доступно luci-app-uhttpd для настройки интерфейса uhttpd в LuCI.
update_nginx булево no 0 Удалено в acme v4.0.0. После выдачи сертификата настройте Nginx на использование нового сертификата. Например, вызов nginx-util add_ssl. Затем перезагрузить сервис nginx. Обновить конфигурацию nginx с этим сертификатом после его выпуска (выберите только для одного сертификата). Nginx должен поддерживать ssl, если нет то он не запустится так как он должен быть скомпилирован с поддержкой ssl для использования опций cert
update_haproxy булево нет 0 Удалено в acme v4.0.0. После выдачи сертификата настроить HAProxy на использование нового сертификата. Т.е. изменить опцию bind в haproxy.cfg. Затем перезагрузить службу haproxy.
user_setup путь нет пусто Удалено в acme v4.0.0. Пользовательский скрипт установки
user_cleanup путь нет пусто Удален в acme v4.0.0. Пользовательский скрипт очистки

Пакет acme-acmesh устанавливает полный acme.sh скрипт в /usr/lib/acme/client/acme.sh, так что вы можете вызвать его без конфигурации UCI, например:

mkdir /www/.well-known/
ln -s /var/run/acme/challenge/ /www/.well-known/acme-challenge
/usr/lib/acme/client/acme.sh --issue -d example.com -w /var/run/acme/challenge/

Смотрите больше примеров в acme.sh вики: Как выпустить сертификат

Перед acme v4 путь был /usr/lib/acme/acme.sh.

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
  • Last modified: 2024/12/16 11:52
  • by stokito