В продолжение темы об установке и настройке OpenVPN Access Server, см. OpenVPN: настройка SSL и hostname.
Прошло три месяца, строк действия сертификата от Let’s Encrypt закончился, надо его обновить (см. Prometheus: Alertmanager и blackbox-exporter — проверка срока действия SSL и нотификация в Slack).
Можно было бы использовать привычную мне схему с webroot, но OpenVPN AS сам принимает подключения — NGINX тут нет, а устанавливать NGINX чисто ради Let’s Encrypt верификацию через webroot — так себе идея.
Сделаем по другому: используем DNS-авторизацию.
Содержание
AWS IAM и certbot-пользователь
У нас домен обслуживается AWS Route53 — используем плагин
Получаем ID зоны:
Создаём IAM-policy, в ChangeResourceRecordSets
указываем ID зоны:
{ "Version": "2012-10-17", "Id": "certbot-dns-route53 sample policy", "Statement": [ { "Effect": "Allow", "Action": [ "route53:ListHostedZones", "route53:GetChange" ], "Resource": [ "*" ] }, { "Effect" : "Allow", "Action" : [ "route53:ChangeResourceRecordSets" ], "Resource" : [ "arn:aws:route53:::hostedzone/Z30***LB6" ] } ] }
(уже позже подумал, что каждая политика создаётся на отдельную зону, потому в имени политики лучше добавлять имя домена, и если пользователей создавать отдельных — то тоже указывать имя домена, к которому есть доступ)
Создаём юзера c Programmatic access:
В Permissions выбираем Attach existing policies directly, и подключаем созданную политику:
Для проверки — устанавливаем aws-cli
:
Под пользователем openvpnas настраиваем default-профайл:
Проверяем конфиг:
Профиль есть, настроен. Далее его будет использовать certbot
.
Для проверки прав доступа — пробуем получить зону:
Окей.
certbot DNS verification
Устанавливаем certbot
:
И сам плагин:
Авторизируемся, и получаем сертификат:
Проверяем зону в Route53 — certbot
создал TXT-запись, которая используется ддля авторизации, и далее certbot
будет обновлять её каждые три месяца:
Проверяем конфиг для обновлений:
Для обновления — достаточно вызвать certbot renew
.
OpenVPN Access Server SSL update
Для обновления сертификата в OpenVPN AS потребуются:
- загрузить сертификат:
sacli --key "cs.cert" --value_file "/etc/letsencrypt/live/vpn.example.com/cert.pem" ConfigPut
- загрузить сертификат Let’s Ecnrypt:
sacli --key "cs.ca_bundle" --value_file "/etc/letsencrypt/live/vpn.example.com/chain.pem" ConfigPut
- и загрузить приватный ключ нашего сертификата:
sacli --key "cs.priv_key" --value_file "/etc/letsencrypt/live/vpn.example.com/privkey.pem" ConfigPut
- перезагрузить OpenVPN сервер
Соберём все команды в скрипт, который потом будем вызывать из cron
.
Переходим в каталог скриптов OpenVPN:
Создаём скрипт ssl_renew.sh
:
#!/usr/bin/env bash SCRIPTS="/usr/local/openvpn_as/scripts/" $SCRIPTS/sacli --key "cs.cert" --value_file "/etc/letsencrypt/live/vpn.example.com/cert.pem" ConfigPut $SCRIPTS/sacli --key "cs.ca_bundle" --value_file "/etc/letsencrypt/live/vpn.example.com/chain.pem" ConfigPut $SCRIPTS/sacli --key "cs.priv_key" --value_file "/etc/letsencrypt/live/vpn.example.com/privkey.pem" ConfigPut $SCRIPTS/sacli start
Чисто на всякий случай — бекапим текущие ключи:
Запускаем скрипт для проверки:
Проверяем в браузере:
Далее, добавляем хук для certbot
, что бы он вызывал скрипт после обновления сертификата.
Редактируем /etc/letsencrypt/renewal/vpn.example.com.conf
:
... [renewalparams] authenticator = dns-route53 account = 6bc***4f6 installer = None renew_hook = /usr/local/sbin/openvpnas_renewcerts.sh
И последним шагом — добавляем вызов certbot
в cron
— вызываем crontab -e
:
0 0 * * * /usr/bin/certbot renew &> /var/log/letsencrypt/letsencrypt.log
Готово.