Let's Encrypt сертификаты с нуля

На фоне наступившего срока истечения сертификата IdenTrust DST Root CA X3 я решил первым постом описать весь процесс связывания генерации сертификатов Let’s Encrypt с доменом используя только официальный клиент.

Рассматривая существующие клиенты Let’s Encrypt я остановился на acme.sh. Мне показалось, возможностей у этого клиента побольше, чем у конкурентов. Установка также не должна вызвать сложностей. Не малую роль сыграли негативные воспоминания о certbot.

Также передо мной стоял выбор DNS-хостинга. Основными критериями были: бесплатность (я еще не готов платить за DNS-хостинг), универсальность (не зависит от регистратора), поддержка DNSSEC, поддержка API для управления записями. Мой выбор пал на deSEC.io (долгих лет жизни ему). Основной его минус - какой-то сыроватый интерфейс управления записями, но не так часто он и нужен.

Домен

Чтобы не тормозить процесс настройки, первым делом я предлагаю зарегистрировать новый домен, если он еще не зарегистрирован, и отметить NS-сервера, которые предлагает DNS-хостинг. В моем случае это ns1.desec.io и ns2.desec.org. После добавления домена deSec показывает страницу с настройками, где можно найти информацию для активации DNSSEC. А пока в глобальной сети информация о Вашем домене обновляется (может занимать до 72 часов) продолжим настройку.

acme.sh

Официальная страница на GitHub предлагает на выбор 2 варианта установки. Воспользуемся скриптом для автоматической установки:

curl https://get.acme.sh | sh -s email=my@example.com

Обязательно надо убедиться, что скрипт для обновления прописался в кроне. Если запись отсутствует, то надо добавить вручную:

46 0 * * * /root/.acme.sh/acme.sh --cron --home /root/.acme.sh > /dev/null

Выпускаем сертификат

Теперь можно начинать экспериментировать с выпуском сертификатов. Дабы не множить запросы для каждого поддомена, я часто пользуюсь выпуском сертификатов с проверкой dns-01. Для удобной реализации подобного чуда как раз и требуется поддержка API со стороны DNS-хостинга. В случае с deSEC достаточно создать долгосрочный токен и выполнить команду для нужного домена

DEDYN_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXXXXX acme.sh --issue --dns dns_desec -d mydomain.com -d *.mydomain.com

Теперь у Вас будет один сертификат для основного домена и всех его поддоменов. Сертификаты, которые выпущены с помощью acme.sh, складываются в ~/.acme.sh в отдельных директориях.

Если Вы не хотите либо не можете использовать подтверждение домена через dns-01, можно воспользоваться проверкой http-01. Такой метод не поддерживает wildcard, все домены для одного сертификата требуется перечислить в одной команде. Также следует учитывать, что у Вас настроен веб-сервер, и все нужные домены привязаны к одной директории.

acme.sh --issue -d mydomain.com -w /home/wwwroot/mydomain.com

Не так давно у скрипта acme.sh появилась возможность подтверждать домены, используя встроенный веб-сервер, что позволяет выпускать сертификаты для доменов без настроенного веб-сервера. Основные условия: свободный порт 80/443, домены завернуты на текущий сервер.

# port 80
acme.sh --issue --standalone -d mydomain.com
# or port 443
acme.sh --issue --alpn -d mydomain.com

Другие способы выпуска сертификата оставляю на самостоятельное изучение)

Установка сертификата

В официальной документации отмечено, что не рекомендуется использовать сертификаты напрямую из директории ~/.acme.sh. Вместо этого лучше воспользоваться командой для установки сертификата, что также позволит указать команду, которая будет выполнена в случае успешного обновления сертификата, например, перезагрузка nginx для применения нового сертификата.

acme.sh --install-cert -d mydomain.com \
--cert-file /path/to/cert.pem \
--key-file /path/to/key.pem \
--fullchain-file /path/to/fullchain.pem \
--reloadcmd "systemctl restart nginx"

Заключение

Теперь Вы можете не беспокоится о сертификатах для Вашего домена. После выполнения операций, указанных выше, Вы получите перевыпуск сертификатов каждые 60 дней, что позволит вообще забыть про такую проблему как просроченный сертификат у Вашего домена.