Перейти к основному содержимому

Выпуск TLS-сертификатов от Let's Encrypt

·435 слов·3 минут
DevOps • Networks • Security • Infrastructure
Автор
DevOps • Networks • Security • Infrastructure
DevOps/Network/Infra Engineer, CyberSecurity Expert

Универсальный скрипт для выпуска 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.

Related

Использование TLS клиента OpenSSL для тестирования HTTPS
·1150 слов·6 минут
Как HTTPS защищает данные
·2186 слов·11 минут
SSH-туннелирование
·419 слов·2 минут