Tech
January 24, 2024

Certbot, dns, wildcard Reg.ru API

Дисклеймер:

Когда я решал проблему, мне на глаза не попалась библиотека certbot-regru. Рекомендую ознакомиться с этой библиотекой, прежде чем читать статью, возможно это решит вашу проблему. Сам я её еще не использовал. Ссылочка https://pypi.org/project/certbot-regru/

Проблема

Вы можете использовать Certbot для получения Let's Encrypt сертификата. Клиент реализует протокол ACME и позволяет получить сертифкат моментально.

Для получения сертификата в manual режиме, вам потребуется подтвердить владение доменом, пройти так сказать "Identifier Validation Challenge", используя способ http или dns. А при получение wildcard сертификата, документация требует использовать dns.

Это значит, чтобы получить wildcard сертификат, вам нужно добавить в DNS домена TXT запись для _acme-challenge.example.com. Это несложно только если вы не хотите автоматизировать установку сертификата.

К счастью у DNS-хостеров есть API, а у Certbot есть плагины для этого. Плагины перечислены здесь 🤠

К несчастью, плагина для Reg.RU API нет 🙄 (ознакомьтесь с дисклеймером)

Решение

Ниже представлен скрипт, который может помочь вам автоматизировать процесс добавления записи и подтверждения домена при получении wildcard сертификата. Решение не является конечным, требует некоторых доработок, но уже сейчас работает и ускоряет процесс убирая часть ручного труда.

Представим что нам нужен wildcard: *.example.com

Создадим файл authenticator.sh

#!/bin/bash

#Основные параметры
TXT_DOMAIN="example.com"
TXT_SUBDOMAIN="_acme-challenge.example.com"

#Параметры для удаления текущих записей
TXT_DELETE="input_format=json&input_data={\"username\":\"$CERBU\",\"password\":\"$CERBP\",\"domains\":[{\"dname\":\"$TXT_DOMAIN\"}],\"subdomain\":\"$TXT_SUBDOMAIN\",\"record_type\":\"TXT\",\"output_content_type\":\"plain\"}"

#Параметры для добавления записи
TXT_ADD="input_format=json&input_data={\"username\":\"$CERBU\",\"password\":\"$CERBP\",\"domains\":[{\"dname\":\"$TXT_DOMAIN\"}],\"subdomain\":\"$TXT_SUBDOMAIN\",\"text\":\"$CERTBOT_VALIDATION\",\"output_content_type\":\"plain\"}"

#Можно проверить при желении
#echo -e "DELETE: $TXT_DELETE\n\n"
#echo -e "ADD: $TXT_ADD\n\n"

#Запрос на удаление
curl -X GET -d "$TXT_DELETE" "https://api.reg.ru/api/regru2/zone/remove_record"
#Запрос на создание
curl -X GET -d "$TXT_ADD" "https://api.reg.ru/api/regru2/zone/add_txt"

#Немного времени, чтобы DNS обновились
sleep 25

! Обратите внимание на $CERBU и $CERBP. Это пара login/password от личного кабинета Reg.ru. Добавьте в переменные среды эти переменные, где CERBU=userRegru а CERBP=passwordRegru.

Выполним скрипт:

certbot certonly --manual --preferred-challenges=dns --manual-auth-hook ./authenticator.sh -d *.d4.dclouds.ru --email=karpov.am@dclouds.ru --server https://acme-v02.api.letsencrypt.org/directory --agree-tos --non-interactive --manual-public-ip-logging-ok

обратите внимание на параметры, которые понадобится поправить, в особенности на --manual-auth-hook где передается путь до authenticator.sh/

Готово! При запуске certbot выполнит authenticator.sh, объявив $CERTBOT_VALIDATION - строку, которая будет прописана в DNS.

ps. В лучшем случае certbot ничего не спросит. Но скорее всего спросит 😅