- Почему лучше рассчитывать на sni?
- Caveat emptor
- Cert-manager
- №1. самоподписанный сертификат
- №3. wildcard le с валидацией через dns
- №4. использование специальных аннотаций ingress
- Вот и всё
- Если нужно добавить поддомен или домен в сертификат
- Если нужно получить сертификат для домена без сайта…
- Клонировать acme.sh проект с git
- Обновление скрипта acme.sh
- Подготовим nginx к получению сертификатов
- Получаем сертификаты
- Получение скрипта acme.sh
- Проверим полученный сертификат
- Продление сертификатов
- Регистрация в let’s encrypt
- Создание сертификата
- Установка в jessie
- Установка сертификата на nginx с помощью acme.sh
- Шаг 2: создание сертификата
- Вместо заключения
Почему лучше рассчитывать на sni?
Это просто. Вам не нужно постоянно держать в голове факты о выданных сертификатах. Для какого домена сертификат был выдан первым. К какому сертификату нужно добавлять еще домены. И так далее… Ни о чем таком со SNI не нужно думать.
- Секреты остаются секретами. Если у вас для всех доменов один сертификат, то любой сможет очень легко увидеть весь список, независимо от вашего желания. Если же для каждого сайта свой сертификат, то такой проблемы нет.
Например, так можно посмотреть домены в сертификате Тематических Медиа:
Caveat emptor
Всё знаете про SNI? Читайте сразу про установку.
Cert-manager
— специальный проект для Kubernetes, представляющий собой набор CustomResourceDefinitions (отсюда
на минимально поддерживаемую версию K8s — v1.12) для конфигурации CA (удостоверяющих центров) и непосредственного заказа сертификатов. Установка CRD в кластер тривиальна и
к применению одного YAML-файла:
№1. самоподписанный сертификат
Ресурс Issuer будет выглядеть так:
apiVersion: cert-manager.io/v1alpha2
kind: Issuer
metadata:
name: selfsigned
spec:
selfSigned: {}А чтобы выпустить сертификат, необходимо описать ресурс
Certificate
, где указывается, как произвести выпуск (см. раздел
issuerRef
ниже) и где размещен приватный ключ (поле
secretName
). После этого в Ingress потребуется сослаться на этот ключ (см. раздел
tlsspec
№3. wildcard le с валидацией через dns
Усложним задачу, выписав сертификат сразу на все поддомены сайта и воспользовавшись на этот раз DNS-проверкой (через CloudFlare).
Для начала получим в панели управления CloudFlare токен для работы через API:
- Profile → API Tokens → Create Token.
- Выставляем права доступа следующим образом:
- Копируем полученный после сохранения токен (например:
y_JNkgQwkroIsflbbYqYmBooyspN6BskXZpsiH4M).
Создадим Secret, в котором будет храниться этот токен, и сошлемся на него в Issuer:
№4. использование специальных аннотаций ingress
Помимо прямого пути по созданию сертификатов в cert-manager есть возможность воспользоваться компонентом под названием
и явно не создавать ресурсы
Certificate
. Идея заключается в том, что с помощью специальных аннотаций Ingress’а сертификат будет автоматически заказан с помощью указанного в них
Issuer
. В результате получается примерно следующий ресурс Ingress’а:
Вот и всё
Если вам близки по духу tee и sed, то есть гораздо более короткая инструкция по настройке связки Let’s Encrypt и nginx, при условии корректно настроенного hostname. Только копируй команды и вставляй.
Если нужно добавить поддомен или домен в сертификат
Если вы вдруг забыли указать поддомен www, или вам нужно добавить другой домен или поддомен в сертификат (которых может быть до 100 в одном сертификате), то это легко сделать после получения сертификата. Просто запустите команду еще раз, добавив требуемое имя:
Если нужно получить сертификат для домена без сайта…
Типичный пример — сертификат для выделенных под SMTP или IMAP серверов, на которых вообще нет каких-то сайтов. Либо используйте универсальный переадресатор что выше, либо…
Клонировать acme.sh проект с git
Выполните следующие команды по одной на строку, чтобы клонировать файл acme.sh с сайта gitрги и выполнить скрипт.
Обновление скрипта acme.sh
Рекомендуется всегда использовать последнюю версию скрипта acme.sh. Для этого выполните такую команду, чтобы убедиться, что acme.sh обновляется автоматически.
$ acme.sh —upgrade —auto-upgrade
Чтобы отключить автоматическое обновление для acme.sh, выполните следующую команду.
$ acme.sh —upgrade —auto-upgrade 0
Если вам это не подходит и вы хотите обновлять acme.sh вручную, то используйте приведенную ниже команду.$ acme.sh —upgrade
Подготовим nginx к получению сертификатов
В общем случае для получения сертификата необходимо во всех блоках server добавить следующий блок до других блоков location:
location /.well-known {
root /var/www/html;
}Понятно, что вписывать для каждого сайта такой блок явно — это моветон, потому создадим файл /etc/nginx/acme с содержанием блока выше.
# cat /etc/nginx/acme
location /.well-known {
root /var/www/html;
}Затем для каждого домена и поддомена, для которых нужно получить сертификаты, в блоке server перед всеми блоками location укажем:
include acme;Хосты-редиректоры (например, с голого домена на www) можно пропустить. ACME сервер обязан учитывать стандартную переадресацию. Подробней об этом ниже.
Перезагрузим nginx и проверим что наш тестовый файл виден:
Получаем сертификаты
У Let’s Encrypt есть лимиты на количество обращений за сертификатами, потому сначала попробуем получить необходимый сертификат в режиме для тестов:
Получение скрипта acme.sh
Скрипт оболочки linux acme.sh автоматизирует выдачу и обновление бесплатных сертификатов от Let’s Encrypt. Вы можете получить acme.sh скрипт скачав его непосредственно из интернета, либо путем клонирования из проекта git.
Проверим полученный сертификат
Убедимся что полученный сертификат — именно тот, что нам нужен:
Продление сертификатов
Сертификаты выдаются на три месяца. Не на полгода, не на год, а лишь на три месяца. Естественно это вызывает вопросы. Нужно ли проходить всю эту процедуру через три месяца? Нужно ли это делать всегда до искончания веков? Может стоит всё-таки вложиться в платный сертификат чтобы забыть об этом всем и не воспоминать пару лет?
Но нет, не спешите искать платежные средства! Как и было обещано в начале статьи, с обновлением сертификатов проблем нет.
Регистрация в let’s encrypt
Регистрацию нужно сделать только один раз:
Создание сертификата
Чтобы сгенерировать сертификат для домена, выполните приведенную ниже команду.
Установка в jessie
Если у вас еще в ходу актуальный на конец 2021 года Debian stable “jessie”, то всё лишь немного сложнее.
Установка сертификата на nginx с помощью acme.sh

После создания сертификата выполните следующую команду, чтобы установить его на NGINX сервер.
Шаг 2: создание сертификата
Откройте командную строку (cmd) от имени администратора и поочерёдно введите следующие команды:
- Выполните
C:wacswacs.exe. - Далее выберите:
- Укажите ваше доменное имя и два раза нажмите Enter для подтверждения.
- Затем последовательно выберите:
- Укажите папку для сохранения сертификатов
C:wacscrt. - После этого выберите:
- Укажите адрес электронной почты для уведомлений об ошибках.
- На дополнительные вопросы отвечайте следующим образом:
Вместо заключения
Путём несложных манипуляций с CRD мы научились выписывать автопродляемые, самоподписанные и бесплатные SSL-сертификаты от проекта Let’s Encrypt для доменов сайтов, запущенных в рамках Ingress’ов в Kubernetes-кластерах.
В статье приведены примеры решения наиболее частых в нашей практике задач. Однако функции cert-manager не ограничиваются описанными выше возможностями. На сайте утилиты можно найти примеры работы с другими сервисами — например, связка с Vault или же использование внешних выпускающих центров (issuers).
