Обновление wildcard-сертификатов Let’sEncrypt

Случай, когда ваш домен располагается на reg.ru

Можно, конечно, воспользоваться сторонними библиотеками, но я не любитель ставить что-то стороннее, если можно обойтись своими силами. Поэтому пришлось потратить время на написание и тестирование bash-скрипта с именем authenticator.sh:

#!/bin/bash

#Основные параметры
domain="kini24.ru"
username="graywolf"
password="********"
# Этот параметр менять не нужно
subdomain=""

# Корректно задаем судбдомен
# Если обрабатывается основной домен, то субдомен будет _acme-challenge
# Если обрабатывается субдомен, то строка будет вида _acme-challenge.subdomain
if [[ $CERTBOT_DOMAIN = $domain ]]
then
  subdomain="_acme-challenge"
else
  subdomain="_acme-challenge.${CERTBOT_DOMAIN%.$domain}"
fi

# Чисто для информации
/usr/bin/echo "Requesting $CERTBOT_DOMAIN"

# Запрос на удаления текущих записей
txt_delete="input_format=json&input_data={\"username\":\"$username\",\"password\":\"$password\",\"domains\":[{\"dname\":\"$domain\"}],\"subdomain\":\"$subdomain\",\"record_type\":\"TXT\",\"output_content_type\":\"plain\"}"

# Запрос на добавления записи
txt_add="input_format=json&input_data={\"username\":\"$username\",\"password\":\"$password\",\"domains\":[{\"dname\":\"$domain\"}],\"subdomain\":\"$subdomain\",\"text\":\"$CERTBOT_VALIDATION\",\"output_content_type\":\"plain\"}"

#Можно проверить при желении
#/usr/bin/echo "Certbot parameters:"
#/usr/bin/echo "Current domain: $CERTBOT_DOMAIN"
/usr/bin/echo "Validation string: $CERTBOT_VALIDATION"
#/usr/bin/echo "Delete request: $txt_delete"
#/usr/bin/echo "Add request: $txt_add"

# Запрос на удаление ВСЕХ TXT записей
if [[ $CERTBOT_DOMAIN != $domain ]]
then
 #/usr/bin/echo "Remove all TXT records"
  /usr/bin/curl --silent --data "$txt_delete" "https://api.reg.ru/api/regru2/zone/remove_record"
fi

# Запрос на создание TXT записи
#/usr/bin/echo "Add new TXT record"
/usr/bin/curl --silent --data "$txt_add" "https://api.reg.ru/api/regru2/zone/add_txt"

# Проверяем что нужная TXT запись появилась. Иначе ждем пока данные обновятся
#answer=""
#while [[ $answer != $CERTBOT_VALIDATION ]]
#do
#  /usr/bin/echo "Requesting DNS record"
#  answer=$(/usr/bin/dig @77.88.8.8 $CERTBOT_DOMAIN txt +short | /usr/bin/tr -d \" | /usr/bin/egrep $CERTBOT_VALIDATION)
#  /usr/bin/sleep 60
#done

if [[ $CERTBOT_REMAINING_CHALLENGES -eq 0 ]]
then
  sleep 15m
fi

# Выводим количество доменов, которые осталось обработать
/usr/bin/echo "Remaining challenges: $CERTBOT_REMAINING_CHALLENGES"

Логика скрипта следующая. В начале задаются основной домен, имя пользователя и пароль от личного кабинета reg.ru. Параметр subdomain менять не нужно, он «вычисляется» по ходу выполнения скрипта. Далее если обрабатывается основной домен, то поддомен становится равным _acme-challenge, иначе в конец еще добавляется поддомен. Формируется строка для удаления всех (!) текущих записей типа TXT, если обрабатыается поддомен. Записи для основного домена просто добавляются (тут да, небольшой косяк, нужно немного дописать скрипт).
Затем, после добавления DNS-записи скрипт должен был запрашивать все записи TXT и, после появлении нужной, продолжать выполнение, но тут скрипт уходил в бесконечный цикл, поэтому я его закомментировал полностью. Сможете исправить — буду благодарен.
На последнем шаге скрипт, если доменов для регистрации не осталось, ждет 15 минут (время обновления записей у reg.ru от 15 минут до 1 часа) и возвращает управление команде certbot.

Вызывается скрипт примерной такой командой:

certbot certonly --manual --agree-tos --manual-public-ip-logging-ok --email admin@kini24.ru --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory --domain *.jabber.kini24.ru --domain *.meet.kini24.ru --domain *.kini24.ru --domain kini24.ru --rsa-key-size 2048 --key-type ecdsa --elliptic-curve secp256r1 --redirect --uir --staple-ocsp --must-staple --hsts --manual-auth-hook /root/authenticator.sh

В этой команде следующие параметры:
certonly — только получение сертификата;
agree-tos — принимаем пользовательское соглашение;
manual-public-ip-logging-ok — соглашаемся на публикацию нашего IP-адреса;
email — указываем свою электронную почту для уведомлений;
preferred-challenges — выбираем тип проверки. Для wildcard-сертификатов это только DNS;
server — указываем сервер сертификации;
domain — перечисляем свои (суб-)домены;
rsa-key-size — указываем «размер» ключа. Значение 2048 по умолчанию, оставил на всякий случай;
key-type — тип ключа. Снова указано значение по умолчанию;
elliptic-curve — «кривые». Тут тоже значение по умолчанию;
redirect — перенаправлять с http на https$
uir — добавляет в ответ заголовок Content-Security-Policy со значением upgrade-insecure-requests;
staple-ocsp — «сшивание» сертификатов;
must-staple — обязательное «сшивание»;
hsts — принудительная активация защищенного режима, т. е. https;
manual-auth-hook — запуск своего скрипта.

Отправить
Поделиться