Получение сертификатов 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).

Данный location должен быть установлен как для HTTP секции, чтобы acme.sh мог обратиться к сайту по http, так и для HTTPS секции, чтобы в дальнейшем можно было обращаться уже по https для продления сертификата.

А далее запуск acme.sh для генерации сертификата:

/opt/acme.sh/acme.sh --issue -d it-lux.ru -w /var/www/letsencrypt

И сама установка сертификата для Nginx:

acme.sh --install-cert -d it-lux.ru \
--key-file       /etc/nginx/ssl/key.pem  \
--fullchain-file /etc/nginx/ssl/cert.pem \
--reloadcmd     "nginx -s reload" 

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

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: