Stupid House

Установка SSL сертификата для HTTPS доступа к Home Assistant


Для безопасного доступа снаружи к Home Assistant необходимо установить SSL сертификат, причины для доступа могут быть разные, от обычного контроля находясь вне дома, до интеграции с Яндекс Алисой или Google Home.

Для доступа понадобиться внешний статический или динамический IP адрес и домен второго или третьего уровня. Статический IP адрес как и зарегистрированный домен гораздо предпочтительней. За IP адресом необходимо обратиться к вашему провайдеру (провайдер может брать дополнительную плату за услугу). Домен лучше купить, но можно воспользоваться сервисом DDNS.

Самоподписанный сертификат не годится, сторонние сервисы, которые мы захотим интегрировать в наш дом, такие как Яндекс, его не примут. Документация на официальном сайте Home Assistant в качестве DDNS сервиса рекомендует использовать DuckDNS, а для получения сертификата центр сертификации Let’s Encrypt. Let's Encrypt позволяет получать бесплатные 90 дневные сертификаты в автоматическом режиме принимаемые в интернете. Это то, что нам нужно.

Если нет прямого доступа к консоли, то подключаемся по SSH и устанавливаем программное обеспечение certbot для получения сертификата.

$ sudo apt-get install certbot

Во время получения сертификата на сервере временно открывается порт 80, через который происходит проверка доступности сервера по нашему доменному имени, поэтому необходимо убедиться, что данный порт не занят другим сервисом, обычно web сервером, если такой сервис уже запущен, то на время получения сертификата нам необходимо его остановить. Если сервер находится во внутренней сети (за маршрутизатором), то необходимо пробросить порт 80 на маршрутизаторе на порт 80 нашего сервера. Данная операция выполняется непосредственно на маршрутизаторе, если возникают сложности, то обратитесь к документации вашего устройства.

Для получения сертификата выполняем команду на нашем сервере:

$ sudo certbot certonly --standalone --email здесь_ваш@email -d здесь_ваш_домен

В соответствующие поля введите ваш электронный почтовый ящик и имя домена, по которому вы будете иметь доступ к своему серверу. При успешном создании сертификата в результате выполнения программы будет сообщено где лежат новые сознанные сертификаты. Для Ubuntu и других систем на основе Debian, в том числе Raspberry Pi OS путь будет:

/etc/letsencrypt/live/здесь_ваш_домен/cert.pem
/etc/letsencrypt/live/здесь_ваш_домен/chain.pem
/etc/letsencrypt/live/здесь_ваш_домен/fullchain.pem
/etc/letsencrypt/live/здесь_ваш_домен/privkey.pem

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

$ sudo cp -f /etc/letsencrypt/live/здесь_ваш_домен/fullchain.pem /home/homeassistant/.homeassistant/fullchain.pem
$ sudo cp -f /etc/letsencrypt/live/здесь_ваш_домен/privkey.pem /home/homeassistant/.homeassistant/privkey.pem
$ sudo chown homeassistant:homeassistant /home/homeassistant/.homeassistant/fullchain.pem
$ sudo chown homeassistant:homeassistant /home/homeassistant/.homeassistant/privkey.pem

В файл configuration.yaml вносим информацию о наших сертификатах:

http:
  ssl_certificate: /home/homeassistant/.homeassistant/fullchain.pem
  ssl_key: /home/homeassistant/.homeassistant/privkey.pem

Проверяем файл настроек средствами Home Assistant и перезапускаем.

Для упрощения обновления сертификата в будущем можно создать скрипт:

#!/bin/sh

email_4_cert="здесь_ваш@email"
domain_ha="здесь_ваш_домен"
dir_ha_home="/home/homeassistant"
/usr/bin/certbot certonly --standalone --email $email_4_cert -d $domain_ha
cp -f /etc/letsencrypt/live/$domain_ha/fullchain.pem $dir_ha_home/.homeassistant/fullchain.pem
chown homeassistant:homeassistant $dir_ha_home/.homeassistant/fullchain.pem
cp -f /etc/letsencrypt/live/$domain_ha/privkey.pem $dir_ha_home/.homeassistant/privkey.pem
chown homeassistant:homeassistant $dir_ha_home/.homeassistant/privkey.pem

Сохраняем скрипт на сервере, в последующем по необходимости запускаем скрипт и перезапускаем сервис Home Assistant.

Для доступа к серверу снаружи, при нахождении его за маршрутизатором, пробрасываем порт 8123 от маршрутизатора до нашего сервера. Для упрощения или при проблемах доступа внутри локальной сети по имени домена в DNS сервере маршрутизатора создаем статическую запись типа А пары: ваш_зарегистрированный_домен -> локальный_IP_адрес_сервера (не обязательно, не все маршрутизаторы поддерживают данную функцию).

Для мониторинга срока истечения сертификата добавляем интеграцию Certificate Expiry в Home Assistant.

Configuration -> Integrations -> + -> Certificate Expiry

В поле Host пишем: ваш_зарегистрированный_домен, в поле Port 8123 (для конфигурации, описанной выше).

Добавляем карточку Entities в Dashboards, вносим сенсоры sensor.cert_expiry_ваш_зарегистрированный_домен и sensor.cert_expiry_timestamp_ваш_зарегистрированный_домен.

homeassistant ssl information

Добавляем автоматизацию для напоминания о замене сертификата за 5 дней в сервис уведомлений Home Assistant и Telegram bot (Подключение Telegram bot к Home Assistant). В файл automations.yaml добавляем:

- id: 'certificate_expiration_reminder'
  alias: "Certificate expires in 5 days"
  description: "Сертификат истекает через 5 дней"
  trigger:
  - entity_id: sensor.cert_expiry_ваш_зарегистрированный_домен
    platform: numeric_state
    below: '6'
  condition: []
  action:
  - service: persistent_notification.create
    data:
      message: "Срок действия сертификата Home Assistant истекает через 5 дней"
      title: "⚠ Certificate Expiration"
  - service: telegram_bot.send_message
    data:
      message: "⚠ Срок действия сертификата Home Assistant истекает через 5 дней"

Проверяем доступ к нашему серверу по HTTPS по имени домена и не забываем про мобильные устройства.

 

UPD - 03.2020: Не прошло и пары лет как лень обновлять сертификаты вручную победила :) Для таких же лентяев рекомендуется к прочтению статья: Автоматическое обновление сертификатов Let's Encrypt для Home Assistant.

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

Комментарии


Добрый день! 

Можете подробнее раскрыть тему автоматического продления SSL сертификата? 

Естественно хочется автоматизацию хочется иметь в Home Assistant =) 

Идеально было бы так: 

-открыть порт 80 

-обновить сертификат

-закрыть порт 80

-перезапустить HA

-послать сообщение в телегу, что можно курить бамбук, сертификат успешно обновлён. 

Ну чтобы автоматизация была автоматизацией, а не сообщением, что "тут" умный дом, без твоего участия ничего не может =) 

 

Что бы Home Assistant обновил свой сертификат его надо перезагрузить. В скрипт обновления сертификата вносите строчки:

1. Остановить службу Home Assistant: systemctl stop homeassistant@homeassistant.service

2. Добавить команду на добавления правила в Firewall на открытие порта

3. Основная часть обновления сертификата как в скрипте

4. Добавить команду на удаление правила из Firewall

5. Запустить службу Home Assistant: systemctl start homeassistant@homeassistant.service

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

В Home Assistant добавляете автоматизацию, которая будет смотреть срок более 89 дней и слать сообщение, что сертификат обновлен.

Это всё на вскидку, т.к. за 3 месяца раз или два на сервер все равно заходишь, что бы поставить обновления, почему бы тогда и сертификат не продлить.

Если компьютер за маршрутизатором надо позаботится о пробросе порта, либо держать его открытым в случае какого нибудь D-Link.

А подскажите пожалуйста где корневая папка Home Assistant находится если он установлен в Doker ?

Папка с конфигурацией PATH_TO_YOUR_CONFIG  понятно в корневом разделе диска создалась  и с ее редактированием проблем не возникло.

А вот куда кидать эти SSL сертификаты  и как правильно их прописывать в configuration.yaml    у меня образовался затык.

/usr/share/hassio/homeassistant