Stupid House

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


После того, как в очередной раз Алиса послала в лес за сертификатом отказавшись включать освещение пришлось все-таки заморочиться и сделать трудоемкий процесс обновления сертификатов автоматическим. Конечно скрипт выполняющий обновление сертификата уже давно написан, вручную необходимо только пробросить 80 порт до сервера HA, запустить скрипт и не забывать это делать вовремя. Последнее дается тяжелее всего, несмотря на то, что в Home Assistant есть специальная интеграция Certificate Expiry отслеживающая окончание действия сертификатов.

 

 

Установка 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 проброшен на другую машину в локальной сети. Последовательность будет следующая:

  1. Подключаемся к маршрутизатору по SSH, в правилах обработки NAT отключаем правило текущего проброса порта 80 и включаем правило проброса до машины с Home Assistant, при этом необходимые правила должны быть подготовлены. Как реализовать подобную схему на маршрутизаторах других производителей необходимо изучать документацию.
  2. Получение нового сертификата.
  3. Копирование нового сертификата в папку Home Assistant и выставление соответствующих прав на него.
  4. Возвращение правил NAT на маршрутизаторе в исходные состояния.
  5. Перезагрузка Home Assistant.

 

Настройка маршрутизатора MikroTik

Для подключения к MikroTik будем использовать отдельного пользователя, а вход осуществлять по ключу.

На MikroTik в разделе System -> Users -> Groups создаем новую группу с правами local, ssh, read, write.

mikrotik create group

 

В разделе System -> Users -> Users создаем нового пользователя и назначаем его в созданную на предыдущем этапе группу. Пароль задаем произвольный, чем сложнее, тем лучше, его можно не запоминать так как подключаться будем при помощи публичного ключа.

mikrotik create new user

Подключаемся к серверу 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 import ssh key

Проверяем подключение к 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 позволяет выпускать обновленные сертификаты хоть каждый день, ограничение составляет что-то около не более пяти сертификатов в день для домена.

Теперь дожидаемся первое число месяца и утром проверяем обновился ли сертификат :)

 

Автор: muxa, 07.02.2022
Войдите или зарегистрируйтесь, чтобы иметь возможность оставлять комментарии