3 min read

Синхронизация сертификатов между Nginx Proxy Manager и Synology DSM

Синхронизация сертификатов между 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

Также можно включить отправку уведомления на почту при выполнении скрипта. Вот и всё!