Инструкции
In this article:
Инструкции#
Выпуск и продление TLS-сертификатов Let’s Encrypt с использованием certbot#
Инструкция описывает процесс выпуска и продления, в том числе автоматического, TLS-сертификатов (традиционно называемых SSL-сертификатами) Let’s Encrypt для доменов в К2 Облаке. Для подтверждения владения доменом применяется способ проверки DNS-01 challenge. Проверочная запись размещается в DNS-зоне домена с помощью Route53 API.
Для выпуска и продления сертификатов используется утилита certbot.
Она запускается в docker-контейнере, позволяет выпускать в том числе подстановочные сертификаты (wildcard) и не требует изменения конфигурации веб-серверов.
Предварительные требования#
Для настройки выпуска TLS-сертификатов Let’s Encrypt потребуется:
экземпляр с ОС Linux с установленным и запущенным Docker;
настройки для доступа по API;
доменное имя, зарегистрированное в публичной зоне верхнего уровня (например, .ru, .com, .net);
публичная DNS-зона для этого домена, созданная в сервисе DNSaaS К2 Облака;
настроенное делегирование домена на DNS-серверы, указанные в публичной DNS-зоне в сервисе DNSaaS для этого домена.
Примечание
Делегирование домена выполняется на стороне доменного регистратора и не рассматривается в рамках данной инструкции.
Примечание
Для выполнения действий следует создать отдельного пользователя и назначить ему политику Route53FullAccess.
Настройка окружения#
Создайте файл
.envсо следующим содержимым:$ nano ~/.env CERTBOT_VERSION=v3.0.1 AWS_ACCESS_KEY_ID=${C2_PROJECT}:${BASE_ACCESS_KEY} AWS_SECRET_ACCESS_KEY=${EC2_SECRET_KEY} AWS_ENDPOINT_URL=https://route53.k2.cloud AWS_DEFAULT_REGION=ru-msk
Примечание
Для корректного выпуска сертификатов обязательно укажите значения для переменных окружения AWS_ENDPOINT_URL и AWS_DEFAULT_REGION.
В качестве значения переменной окружения AWS_DEFAULT_REGION следует использовать
ru-msk.Создайте файл
docker-compose.ymlсо следующим содержимым:$ nano ~/docker-compose.yml services: certbot: image: certbot/dns-route53:${CERTBOT_VERSION} container_name: certbot environment: - AWS_ACCESS_KEY_ID=${C2_PROJECT}:${BASE_ACCESS_KEY} - AWS_SECRET_ACCESS_KEY=${EC2_SECRET_KEY} - AWS_ENDPOINT_URL=${ROUTE53_URL} - AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION} volumes: - certbot-etc:/etc/letsencrypt
Примечание
Значения переменных
{C2_PROJECT}:${BASE_ACCESS_KEY},{EC2_SECRET_KEY}и{ROUTE53_URL}приведены в файле настроек доступа к API. Этот файл можно получить в веб-интерфейсе. Для этого нажмите на логин пользователя в правом верхнем углу и выберите Профиль Получить настройки доступа к API.
Выпуск сертификата#
Для выпуска сертификата отправьте запрос:
$ docker compose run --rm certbot certonly \
--dns-route53 \
--email admin@example.com \
--agree-tos \
--no-eff-email \
-d example.com \
-d '*.example.com'
После успешного выполнения выпущенные сертификаты будут сохранены в каталоге ./letsencrypt/live/$domain/:
fullchain.pem— цепочка сертификатов, начиная с корневого;privkey.pem— приватный ключ сертификата.
При ошибках выполнения команды в консоли экземпляра отобразятся сообщения с их причинами и способами устранения.
Продление сертификата#
Срок действия TLS-сертификатов типа Let’s Encrypt составляет 90 дней.
Для продления сертификата отправьте запрос:
$ docker compose run --rm certbot renew
Автопродление сертификата#
Для настройки автоматического продления сертификата
Откройте редактор cron:
$ crontab -e
Добавьте следующую строку (замените пути и ключи на свои):
$ 0 3 * * * docker compose run --rm certbot renew \ --quiet \ --deploy-hook "docker restart nginx"
Cron-выражение 0 3 * * * устанавливает период запуска команды «каждый день в 3 часа утра».
Чтобы установить другой период запуска, отредактируйте выражение в соответствии со спецификацией cron.
Примечание
При указании параметра --deploy-hook "docker restart nginx" веб-сервер будет перезагружен только при успешном обновлении сертификата.
Указанное в примере значение docker restart nginx применимо только при использовании nginx в качестве веб-сервера.
При использовании других веб-серверов следует соответствующим образом изменить значение параметра.