Все знают про бесплатные сертификаты 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"
На этом процедура получения и продления сертификата закончена, всё оказалось совсем просто.