Универсальный скрипт для выпуска TLS-сертификатов Let’s Encrypt с помощью ACME-клиента Certbot (DNS-01 challenge) #
SSL/TLS-сертификат - это цифровой файл, который подтверждает связь доменного имени с криптографическим ключом и позволяет установить защищённое HTTPS-соединение между веб-сервером и браузером пользователя.
Сертификат обеспечивает шифрование передаваемых данных — например, логинов, паролей и персональной информации. При корректно настроенном HTTPS браузер отображает значок замка в адресной строке, указывая на защищённое соединение.
Let’s Encrypt - бесплатный автоматизированный центр сертификации (Certificate Authority, CA), созданный некоммерческой организацией ISRG. Он позволяет бесплатно получать TLS-сертификаты, которые по умолчанию выдаются на 90 дней. Для выпуска сертификата необходимо подтвердить контроль над доменом с помощью протокола ACME.
Для автоматизации Let’s Encrypt предоставляет ACME-клиенты, которые могут самостоятельно выполнять проверку домена, получать и устанавливать сертификаты, а также своевременно продлевать их без необходимости вручную выполнять эти операции.
Скрипт issue-certificate-manual-dns.zip выпускает обычные и wildcard-сертификаты Let’s Encrypt без публичного IP, проброса портов и API-токена DNS-провайдера. Для подтверждения домена достаточно вручную создать TXT-запись, которую покажет Certbot.
Что потребуется #
- Linux и Bash;
- запущенная служба Docker;
opensslи стандартные утилиты Linux;- доступ к управлению DNS-зоной домена;
- запуск через
rootилиsudo.
Скрипт и конфигурация должны лежать рядом:
scripts/
├── issue-certificate-manual-dns.sh
└── .env.certificate
Сделайте скрипт исполняемым:
chmod +x scripts/issue-certificate-manual-dns.sh
Конфигурация #
Создайте scripts/.env.certificate:
ACME_EMAIL=admin@example.com
CERTIFICATE_DOMAIN=*.example.com
Если CERTIFICATE_DOMAIN не указан, скрипт запросит домен при запуске. Email
также будет запрошен, если отсутствует в конфигурации и окружении.
Выпуск сертификата #
Запуск с настройками из .env.certificate:
sudo ./scripts/issue-certificate-manual-dns.sh
Домен можно передать аргументом. Для wildcard необходимо защитить * от
раскрытия оболочкой — кавычками или обратным слешем:
sudo ./scripts/issue-certificate-manual-dns.sh '*.example.com'
sudo ./scripts/issue-certificate-manual-dns.sh \*.example.com
Certbot покажет точное имя и значение TXT-записи, например:
_acme-challenge.example.com TXT <значение от Certbot>
Создайте эту запись у DNS-провайдера, дождитесь ее публикации и только затем нажмите Enter. Не удаляйте TXT до сообщения об успешной проверке.
После выпуска готовая пара появится в каталоге проекта:
certs/fullchain.pem
certs/privkey.pem
Приватный ключ получает права 0600, цепочка сертификатов — 0644.
Как работает скрипт #
Скрипт проверяет домен, email, необходимые команды, Docker и интерактивный
терминал. Затем он запускает официальный образ Certbot в Docker с ручным DNS-01 и хранит
состояние ACME в каталоге certbot/
Перед установкой проверяются срок действия сертификата, соответствие доменному
имени и совпадение public key сертификата с private key. Если в certs/ уже
есть сертификат, он сохраняется в:
scripts/backups/<дата-время>-manual-dns01/
Только после успешных проверок новые файлы заменяют действующую пару. Повторный
запуск использует --keep-until-expiring, поэтому Certbot не должен запрашивать
новый сертификат раньше срока без необходимости. Поскольку DNS-01 ручной,
продление также требует повторного интерактивного запуска сценария.
Let’s Encrypt поддерживает wildcard SSL (например, *.example.com), но для них обязательно используется DNS-валидация. При получении wildcard-сертификата Certbot предложит добавить ТХТ-запись в DNS вашего домена.
Сертификат
*.example.comпокрывает поддомены вродеauth.example.com, но не корневое имяexample.com.