Получение сертификатов Let`s Encrypt с помощью acme.sh и верификацией через API DNS-провайдера

Все знают про бесплатные сертификаты Let`s Encrypt и наверняка многие пользуются ими. Для их получения обычно используется клиент на python – certbot. Но он требует дополнительных пакетов, а потому я нашёл превосходный альтернативный вариант на bash, который работает быстрее и проще – называется acme.sh

Официальная документация на английском языке вполне себе понятная, здесь же я кратко опишу процесс получения сертификата wildcard для домена на yandex connect с верификацией через API.

В оф. документации можно посмотреть список поддерживаемых DNS-провайдеров, поддерживаются многие, в т.ч. русские (reg.ru).

Исходный домен прикручен к connect.yandex.ru. Для автоматического создания проверочных TXT-записей в зоне DNS необходим токен, который можно получить по ссылке (нужно залогиниться): https://pddimp.yandex.ru/api2/admin/get_token

Теперь можно установить acme.sh. Можно сделать через curl, можно склонировать репозиторий – кому как удобно:

curl https://get.acme.sh | sh

Установщик выполнит 3 действия:

  • Создаст и скопирует файл acme.sh в директорию ($ HOME): ~/.acme.sh/. В данном случае в /root/.acme.sh, там же будут и сертификаты. Можно изменить при необходимости. (для этого установка должна быть через git clone, а директория под сертификат должна быть пустой)
  • Создаст alias для acme.sh
  • Создаст запись в cron для проверки и обновления сертификатов (для пользователя, от кого была инициирована установка)

Перед генерацией сертификата выполнить экспорт токена:

export PDD_Token="your_token"

И запустить acme.sh

acme.sh --issue --dns dns_yandex --dnssleep 1200 -d it-lux.ru -d '*.it-lux.ru' --renew-hook "nginx -s reload"

В команде выше указывается метод верификации – DNS, DNS-таймаут в 20 минут, т.к. записи не сразу будут доступны, домен второго уровня и wildcard (обязательно в кавычках). В конце используется хук для перезагрузки конфига Nginx.

Токен сохраняется после экспорта в файле:

/root/.acme.sh/account.conf

После успешного завершения получения сертификата, выполнив crontab -e, можно увидеть, что создалась новая запись, с помощью которой продление сертификата будет автоматизировано и выполнится через 60 дней. Все параметры, указанные при первом запуске, (таймауты, домен, хуки) – всё это будет сохранено в конфиг /root/.acme.sh/it-lux.ru/ it-lux .ru.conf

Для тестирования, т.к. есть лимит до 5 попыток в час, если не ошибаюсь, можно использовать команду staging и debug:

acme.sh --issue --staging --debug --dns dns_yandex --dnssleep 300 -d it-lux.ru -d '*.it-lux.ru' --renew-hook "systemctl reload nginx"

Получение сертификата с помощью плагина webroot

Также добавлю конфиг nginx для получения сертификата с указанием директории /.well-known/acme-challenge, если нет возможности использовать проверку через DNS.

location ^~ /.well-known/acme-challenge/ {
        auth_basic off;
        root    /var/www/letsencrypt;
    }

Тут всё просто: самым первым блоком (до http-авторизации, если имеется) добавляется location с нужной root-директорией /var/www/letsencrypt, права на которую должны быть установлены такие же, как у веб-сервера (nginx).

А далее уже запуск acme.sh:

/opt/acme.sh/acme.sh --issue -d it-lux.ru -w /var/www/letsencrypt --renew-hook "nginx -s reload"

Внимание!

При выполнении acme.sh с ключом staging, может показаться, что сертификат сгенерировался и его можно уже использовать, т.к. физически он появится в нужной директории.

Но это не так! Нужно после этого убрать ключ staging и добавить ключ –force в конце для получения действительного сертификата.

На этом процедура получения и продления сертификата закончена, всё оказалось совсем просто.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *