Автоматическая генерация Let's Encrypt сертификатов для доменов


Let's Encrypt сертификаты для доменов webnames.ru

Введение

На текущий момент использование сертификатов при работе с сайтами  стало фактически стандартом, обеспечивающим безопасность “прозрачно” для конечного пользователя. Такие сертификаты выдаются множеством различных Удостоверяющих Центров на разных условиях и, более того, могут быть сгенерированы самостоятельно пользователем (“самоподписанные сертификаты”), однако наиболее распространённым на текущий момент видом бесплатных сертификатов являются сертификаты от Удостоверяющего Центра Let’s Encrypt.

Удостоверяющий Центр Let’s Encrypt предлагает довольно ограниченный набор видов сертификатов и не предоставляет возможности получения сертификата через свой web-интерфейс, однако развитый API (протокол ACME) позволяет автоматизировать получение сертификата, используя разнообразные способы подтверждения владения доменом. Так как в этой статье будет описано получение wildcard сертификатов (т.е. для самого домена и всех его поддоменов), в качестве подтверждения будет использоваться TXT запись.

Протокол ACME хорошо описан в RFC 8555, что привело к появлению немалого количества клиентов для подключения, как интегрированных в различные панели управления хостингами, так и отдельно реализованными. Характерным примером последних являются Certbot и Acme.sh, использование которых для получения сертификатов и будет описано в этой статье.

Что делать если у Вас ещё нет имени для сайта? Подобрать имя сайта просто - введите имя в форму и нажмите кнопку поиска. Перед выбором прочитайте нашу статью Пять удачных примеров выбора домена

SSL сертификат от Lets Encrypt автоматически подключается на всех тарифных планах хостинга.

Методы подтверждения

Использование API для получения сертификата позволяет автоматизировать получение сертификата, что в свою очередь позволяет обойти основной недостаток (или, вернее, особенность) сертификатов от Let’s Encrypt - короткий срок действия (3 месяца). Так как в этой статье описывается получение сертификата с подстановкой (то есть wildcard сертификата, действующего на сам домен и все его поддомены), то для проверки владения доменным именем будет использоваться проверка DNS-01, то есть проверка при помощи TXT записей. Алгоритм этой проверки такой:

  1. Клиент запрашивает у Let’s Encrypt получение сертификата.
  2. Let’s Encrypt выдаёт уникальный для домена токен.
  3. Клиент вносит TXT запись _acme-challenge.domain.tld с значением на базе этого токена на указанные для домена DNS серверы.
  4. Let’s Encrypt проверяет наличие и соответствие TXT записи на соответствие выданному токену и, в случае успеха, генерирует и выдаёт сертификат.

Существует дополнительный вариант подтверждения при помощи CNAME записи, что позволяет облегчить настройку для конечных пользователей хостинг-провайдеров, однако этот вариант также сводится к генерации TXT записи, но уже для служебного домена, на который будет указывать CNAME запись. Этот вариант в статье описан не будет, но он также может быть реализован при минимальной модификации скриптов авторизации и внесения ресурсных записей.

Так как проверка DNS-01  требует внесения записей на DNS серверы, требуется доступ к этим DNS серверам. При использовании DNS серверов регистратора (ns1.nameself.com/ns2.nameself.com) возможно использование как реселлерского API (если он подключен для учётной записи, этот вариант в статье не рассматривается), так и специализированного API для добавления записей. При использовании сторонних DNS серверов предлагаемое решение работать не будет, так как внесения ресурсных записей потребуется обращаться к владельцу указанных для домена DNS серверов.

В статье описано получение сертификата в ОС Linux. Возможность использования Certbot в ОС Windows не проверялась, но не исключается. Клиент Acme.sh, к сожалению, в ОС Windows работать не будет. Установка описывается в Ubuntu 20.04, в других ОС потребуется использовать другой пакетный менеджер и, возможно, установить дополнительные пакеты.

Использование клиентов Certbot и Acme.sh

Хорошее описание протокола ACME в RFC 8555 привело к появлению большого количества клиентов для получения сертификата, самыми известными из которых является Certbot и Acme.sh, настройка которых и будет описана в этом разделе.

Предварительная настройка

При использовании специализированного API для добавления ресурсных записей требуется получить ключ доступа (API_KEY) к нему. Ключ и персонализированная инструкция (для вашего домена) доступна в разделе “Личный кабинет” / “Мои домены и услуги” / По ссылке из колонки “Серверы DNS”

Страница управления DNS в Личном кабинете webnames.ru

В дальнейшем описании в качестве имени домена-”заглушки” будет использоваться domain.tld. При реальной работе необходимо заменять его на имя домена, для которого необходимо получение сертификата.

Домен должен быть делегирован(п.1) на DNS-СЕРВЕРЫ РЕГИСТРАТОРА(ns1.nameself.com; ns2.nameself.com). Если домен делегирован на другие DNS-серверы, то API редактора записей(п.2) будет недоступен.
Настройка DNS-серверов webnames.ru

Если для домена DNS серверы указаны в разделе “ЗАДАТЬ САМОСТОЯТЕЛЬНО”, то вам нужно будет обратиться к хостинг-провайдеру домена и использовать инструкцию ACME.SH с ручным внесением записей

Настройка Acme.sh

В отличие от написанного на python Certbot, Acme.sh требует только sh. Процесс настройки можно разбить на 3 шага

  1. Устанавливаем необходимые скрипты *;
  2. Скачиваем скрипт конфигурации с APIKEY;
  3. Получаем SSL ** ***.
Настройки Acme.sh в Личном кабинете webnames.ru
* Все операции нужно производить с правами root
** Cкрипт останавливается на 10 минут для добавления записей на DNS-сервера
*** Директория сертификатов будет выдана в выводе команды

Клиент скачает сгенерированные сертификаты и сохранит их в каталог по умолчанию (будет выдан в выводе команды)

Настройка Certbot

Клиент Certbot является рекомендованным Let’s Encrypt клиентом и доступен в различных дистрибутивах.

Рекомендуется просто установить Certbot из репозитория:

# apt-get install certbot

При установке клиента нужные для его работы пакеты “подтянутся” автоматически.

Дальше получения сертификата можно разбить на 3 шага:

  1. Устанавливаем необходимые скрипты *;
  2. Скачиваем скрипт конфигурации с APIKEY;
  3. Получаем SSL ** ***.
Настройки Certbot в Личном кабинете webnames.ru
* Все операции нужно производить с правами root
** Cкрипт останавливается на 10 минут для добавления записей на DNS-сервера
*** Полученный сертификат будет размещён в /etc/letsencrypt/live/domain.tld/

После выполнения последней команды клиент скачает сгенерированные сертификаты и разместит их в каталоге /etc/letsencrypt/live/domain.tld/

Acme.sh с ручным внесением записей

Если для домена используются сторонние DNS серверы, то вышеперечисленные способы работать, к сожалению, не будут. Однако, если есть доступ к управлению зоной на указанных для домена DNS серверах, возможность получить сертификат всё же есть, хотя и не особенно автоматическая.

Сначала потребуется получить нужный токен:

# acme.sh --issue -d domain.tld -d '*.domain.tld’ --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please

Клиент acme.sh выдаст нужные записи, которые потребуется внести на указанные для домена DNS серверы. После того как записи будут внесены, потребуется выполнить такую команду:

# acme.sh --renew -d domain.tld -d '*.domain.tld’ --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please

Стоит обратить внимание на отличие в этих двух командах. В первой команде режим --issue, во второй --renew.

Полезное

21/11/2022