Инструкции#

Выпуск и продление 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.

Настройка окружения#

  1. Создайте файл .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.

  2. Создайте файл 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

Автопродление сертификата#

Для настройки автоматического продления сертификата

  1. Откройте редактор cron:

    $ crontab -e
    
  2. Добавьте следующую строку (замените пути и ключи на свои):

    $ 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 в качестве веб-сервера. При использовании других веб-серверов следует соответствующим образом изменить значение параметра.