Автоматическое обновление сертификатов Let's Encrypt для Home Assistant

После того, как в очередной раз Алиса послала в лес за сертификатом отказавшись включать освещение пришлось все-таки заморочиться и сделать трудоемкий процесс обновления сертификатов автоматическим. Конечно скрипт выполняющий обновление сертификата уже давно написан, вручную необходимо только пробросить 80 порт до сервера HA, запустить скрипт и не забывать это делать вовремя. Последнее дается тяжелее всего, несмотря на то, что в Home Assistant есть специальная интеграция Certificate Expiry
отслеживающая окончание действия сертификатов.
- Установка SSL сертификата в Home Assistan
- Описание обновления сертификата
- Настройка маршрутизатора MikroTik
- Настройка автоматического обновления сертификатов
Установка SSL сертификата в Home Assistant
Как получить сертификат Let's Encrypt и установить его в Home Assistant здесь мы рассматривать не будем, все подробно описано в статье Установка SSL сертификата для HTTPS доступа к Home Assistant и на текущий момент ничего не изменилось.
Описание обновления сертификата
При создании нового сертификата происходит проверка устройства на порту 80, который открывает certbot
. Если в это время на этом устройстве данный порт открыт каким-либо другим сервисом, в основном это может быть Web сервер (Apache, nginx), то certbot
выдаст ошибку и завершит работу. Поэтому перед созданием нового сертификата необходимо освободить порт 80 погасив соответствующий сервис.
Обычно машина, на которой выпускается сертификат, находится за NAT в локальной сети и для проверки необходимо на маршрутизаторе сделать проброс 80 порта. Получается, что для последующих обновлений необходимо постоянно держать проброшенным порт 80 на маршрутизаторе, что не всегда является возможным, либо делать это каждый раз вручную. Если к маршрутизатору есть возможность подключиться по telnet или ssh, то этот вопрос, возможно, получится автоматизировать, как это сделать будет рассмотрено на примере маршрутизатора MikroTik.
Итак, нам необходимо обновить сертификат для Home Assistant, который находится в локальной сети за маршрутизатором MikroTik, при этом порт 80 проброшен на другую машину в локальной сети. Последовательность будет следующая:
- Подключаемся к маршрутизатору по SSH, в правилах обработки NAT отключаем правило текущего проброса порта 80 и включаем правило проброса до машины с Home Assistant, при этом необходимые правила должны быть подготовлены. Как реализовать подобную схему на маршрутизаторах других производителей необходимо изучать документацию.
- Получение нового сертификата.
- Копирование нового сертификата в папку Home Assistant и выставление соответствующих прав на него.
- Возвращение правил NAT на маршрутизаторе в исходные состояния.
- Перезагрузка Home Assistant.
Настройка маршрутизатора MikroTik
Для подключения к MikroTik будем использовать отдельного пользователя, а вход осуществлять по ключу.
На MikroTik в разделе System -> Users -> Groups
создаем новую группу с правами local
, ssh
, read
, write
.
В разделе System -> Users -> Users
создаем нового пользователя и назначаем его в созданную на предыдущем этапе группу. Пароль задаем произвольный, чем сложнее, тем лучше, его можно не запоминать так как подключаться будем при помощи публичного ключа.
Подключаемся к серверу Home Assistant и генерируем пару, открытого и закрытого ключей для подключения к MikroTik.
$ ssh-keygen -t rsa
Вводим название файлов ключей, например, certbot
.
Generating public/private rsa key pair. Enter file in which to save the key (/user/.ssh/id_rsa): <strong>certbot</strong>
Находим файл /user/.ssh/certbot.pub
и любым доступным способом копируем его на MikroTik в раздел Files
. Если на машине с Home Assistant не настроена для удобства Samba или FTP сервер, то скачать файл публичного ключа можно, например, при помощи программы PSFTP
из пакета PuTTY, но всё придется писать ручками :)
psftp: no hostname specified; use "open host.name" to connect psftp> open ha.smarthome login as: user user@ha.smarthome's password: Remote working directory is /home/user psftp> get /user/.ssh/certbot.pub c:/temp/certbot.pub
На MikroTik в разделе System -> Users -> SSH Keys
импортируем публичный ключ, кнопка Import SSH Key
. В поле User
вписываем созданную учетную запись, в нашем случае это certbot
, в поле Key File
загруженный файл публичного ключа.
В результате в разделе SSH Keys
мы должны получить запись вида:
Проверяем подключение к MikroTik с компьютера, на котором установлен Home Assistant.
$ ssh -i /user/.ssh/certbot certbot@192.168.1.1
Теперь подготовим правило проброса порта 80 в разделе IP -> Firewall -> NAT
.
> /ip firewall nat add chain=dstnat protocol=tcp dst-port=80 in-interface=ether1-wan-main action=dst-nat to-addresses=192.168.1.88 to-ports=80 disabled=yes
На этом настройку маршрутизатора считаем оконченной.
Настройка автоматического обновления сертификатов
Модифицируем скрипт из статьи об установке SSL сертификата.
#!/bin/sh email_4_cert="<strong>здесь_ваш@email</strong>" domain_ha="<strong>здесь_ваш_домен</strong>" mikrotik_addr="192.168.1.1" mikrotik_user="certbot" ha_home_dir="/home/homeassistant" ha_user="homeassistant" ha_group="homeassistant" # Disable/Enable NAT rules on MikroTik /usr/bin/ssh -i /root/.ssh/certbot $mikrotik_user@$mikrotik_addr '/ip firewall nat disable numbers=14' /usr/bin/ssh -i /root/.ssh/certbot $mikrotik_user@$mikrotik_addr '/ip firewall nat enable numbers=25' # Update Cert /usr/bin/certbot -n --force-renewal certonly --standalone --email $email_4_cert -d $domain_ha # Copy new cert cp -f /etc/letsencrypt/live/$domain_ha/fullchain.pem $ha_home_dir/.homeassistant/fullchain.pem chown $ha_user:$ha_group $ha_home_dir/.homeassistant/fullchain.pem cp -f /etc/letsencrypt/live/$domain_ha/privkey.pem $ha_home_dir/.homeassistant/privkey.pem chown $ha_user:$ha_group $ha_home_dir/.homeassistant/privkey.pem # Reset NAT rules on MikroTik /usr/bin/ssh -i /root/.ssh/certbot $mikrotik_user@$mikrotik_addr '/ip firewall nat disable numbers=25' /usr/bin/ssh -i /root/.ssh/certbot $mikrotik_user@$mikrotik_addr '/ip firewall nat enable numbers=14' # Restart HA /bin/systemctl restart home-assistant@$ha_user
Здесь в разделе «Disable/Enable NAT rules» происходит выключение правила проброса порта 80 на один из компьютеров в сети работающего постоянно и включение проброса на компьютер получающего сертификат. В разделе «Reset NAT rules» возвращаем состояние правил в исходное положение. В параметре numbers указывается номер правила, которое необходимо включить или отключить.
Добавляем запуск скрипта в Crontab
первого числа каждого месяца в три часа ночи.
00 03 01 * * /usr/local/scripts/certificate_ha_update >> /dev/null
Сертификат выдается на 90 дней, но Let's Encrypt позволяет выпускать обновленные сертификаты хоть каждый день, ограничение составляет что-то около не более пяти сертификатов в день для домена.
Теперь дожидаемся первое число месяца и утром проверяем обновился ли сертификат :)