Синхронизация сертификатов между Nginx Proxy Manager и Synology DSM
В моей домашней инфраструктуре используется виртуальная машина с Nginx Proxy Manager как единая точка входа практически для всех внешних сервисов, но некоторые сервисы вроде Synology MailPlus могут также требовать сертификаты не только на стандартном 443 порту.
Здесь возникает необходимость поддерживать актуальность сертификатов на DSM, которые получаются и обновляются через NPM.
Nginx Proxy Manager
Создаем специальный домен с кастомным location
:
location /wildcard-my-domain/ {
allow my-synology-ip;
allow my-ip;
deny all;
rewrite /wildcard-my-domain/(.*) /$1 break;
root /data/tls/certbot/live/npm-1;
autoindex on;
autoindex_exact_size on;
autoindex_format html;
autoindex_localtime on;
}
Вместо my-synology-ip
подставляем адрес своего Synology, а вместо my-ip
текущий адрес компьютера, с которого выполняется инструкция. Последний можно убрать из конфига после первичной выгрузки сертификатов. root
должен указывать на папку, в которую NPM складывает сертификат. Номер конкретного сертификата можно узнать на вкладке SSL/TLS Certificates
.
Путь можно указать произвольный. Я предпочитаю случайно сгенерированные строки, например:
❯ openssl rand -base64 12
5ETejNYtnbiZBpEI
Таким образом путь до сертификатов будет:https://conf.my.domain/5ETejNYtnbiZBpEI
Выгружаем сертификаты, а за одно проверяем конфиг:https://conf.my.domain/5ETejNYtnbiZBpEI/cert.pem
https://conf.my.domain/5ETejNYtnbiZBpEI/chain.pem
https://conf.my.domain/5ETejNYtnbiZBpEI/privkey.pem
Synology DSM
Заходим по ssh на Synology:
❯ ls -lsha /usr/syno/etc/certificate/_archive/ > /tmp/before
В первый раз необходимо вручную добавить сертификат через веб-интерфейс Synology: Панель управления > Безопасность > Сертификат > Добавить > Добавить новый сертификат > Импортировать сертификат
❯ ls -lsha /usr/syno/etc/certificate/_archive/ > /tmp/after
❯ diff /tmp/after /tmp/before
1,2c1,2
< 4.0K drwx------ 2 root root 4.0K Aug 18 23:02 wd27Jj
Таким образом мы узнаем, что сертификат расположился в папке wd27Jj
.
Создаем скрипт /volume1/tasks/cert_for_my_domain.sh
. Расположение произвольное, можете указать своё.
#!/bin/bash
# Если срок истекает в ближайшие три дня
if ! /bin/openssl x509 -in /usr/syno/etc/certificate/_archive/wd27Jj/fullchain.pem -noout -checkend 1209600 &>/dev/null;
then
/bin/wget -q -O /usr/syno/etc/certificate/_archive/wd27Jj/fullchain.pem https://conf.my.domain/5ETejNYtnbiZBpEI/fullchain.pem
/bin/wget -q -O /usr/syno/etc/certificate/_archive/wd27Jj/chain.pem https://conf.my.domain/5ETejNYtnbiZBpEI/chain.pem
/bin/wget -q -O /usr/syno/etc/certificate/_archive/wd27Jj/cert.pem https://conf.my.domain/5ETejNYtnbiZBpEI/cert.pem
/bin/wget -q -O /usr/syno/etc/certificate/_archive/wd27Jj/privkey.pem https://conf.my.domain/5ETejNYtnbiZBpEI/privkey.pem
/bin/nginx -t 2>/dev/null && /bin/nginx -s reload 2>/dev/null
fi
Создаем задание в планировщике: Панель управления > Планировщик задач > Создать > Запланированная задача > Скрипт, заданный пользователем
Задача: cert_for_my_domain
Пользователь: root
Расписание: Ежедневно
Время: 07:00
(или любое другое)
Выполнить команду: /bin/bash /volume1/tasks/cert_for_my_domain.sh
Также можно включить отправку уведомления на почту при выполнении скрипта. Вот и всё!