- Почему лучше рассчитывать на sni?
- Caveat emptor
- Cert-manager
- №1. самоподписанный сертификат
- №3. wildcard le с валидацией через dns
- №4. использование специальных аннотаций ingress
- Standalone
- Webroot
- Автоматическое управление
- Вот и всё
- Доступность
- Если нужно добавить поддомен или домен в сертификат
- Если нужно получить сертификат для домена без сайта…
- Надёжное шифрование
- Настройка ssl в nginx
- Настройка ssl сертификатов для других веб-серверов
- Обновление сертификата
- Перенаправление портов
- План работ
- Подготовим nginx к получению сертификатов
- Получаем сертификаты
- Продление ssl сертификата
- Продление сертификатов
- Регистрация в let’s encrypt
- Установка ssl сертификата для apache
- Установка в jessie
- Вместо заключения
Почему лучше рассчитывать на 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’а:
Standalone
Суть standalone заключается в том, что скрипт попытается поднять собственный веб-сервер на время процедуры получения сертификата (дабы подтвердить принадлежность домена), а для этого необходимо будет отключить уже работающий, дабы освободить порты 80 и 443. Для большинства веб-разработчиков данный вариант неудобен из-за необходимости отключения сайта.
Webroot
Данная опция подходит тем, кого не устраивает standalone. При указании ключа –webroot необходимо также будет указать и директорию, где располагаются файлы, которые обрабатывает веб-сервер.
$ ./letsencrypt-auto certonly --webroot -webroot-path /var/www/mydomain/
При работе с данной опцией необходимо настроить веб-сервер на чтение файлов соответствующим образом.
Автоматическое управление
У Let’s Encrypt есть клиент для управления сертификатами. Он умеет автоматически скачивать, устанавливать и продлевать сертификаты. Для этого нужно установить клиент на сервер и разрешить ему менять конфигурацию сервера. Если боитесь, что от этого пострадают другие настройки, устанавливайте и обновляйте сертификат вручную.
Вот и всё
Если вам близки по духу tee и sed, то есть гораздо более короткая инструкция по настройке связки Let’s Encrypt и nginx, при условии корректно настроенного hostname. Только копируй команды и вставляй.
Доступность
В отличие от коммерческих центров сертификации, Let’s Encrypt выдаст SSL-сертификат бесплатно. Это выгодно небольшим сайтам, владельцы которых не могут позволить себе платный SSL-сертификат.
У Let’s Encrypt нет скрытых расходов: с вас не станут требовать денег за скачивание, перевыпуск или продление сертификата. Если хотите поддержать проект, сделайте пожертвование на сайте компании.
Если нужно добавить поддомен или домен в сертификат
Если вы вдруг забыли указать поддомен www, или вам нужно добавить другой домен или поддомен в сертификат (которых может быть до 100 в одном сертификате), то это легко сделать после получения сертификата. Просто запустите команду еще раз, добавив требуемое имя:
Если нужно получить сертификат для домена без сайта…
Типичный пример — сертификат для выделенных под SMTP или IMAP серверов, на которых вообще нет каких-то сайтов. Либо используйте универсальный переадресатор что выше, либо…
Надёжное шифрование
Если переживаете, что бесплатный SSL-сертификат не так надёжно зашифровывает информацию, то это не так. Не смотря на то, что за продукт не нужно платить, уровень защиты такой же как и у платных сертификатов.
Настройка ssl в nginx
Итак, если процедура с созданием сертификатов в manual режиме прошла успешно, то в вышеупомянутой директории мы найдем все необходимые файлы для настройки безопасного соединения.
- privkey.pem – наш приватный ключ
- cert.pem – сертификат сервера
- chain.pem – корневой (root) и промежуточный (intermediate)
- fullchain.pem – все необходимые нам сертификаты для настройки веб-сервера.
Как же в данном случае будет выглядеть настройка Nginx?
Настройка ssl сертификатов для других веб-серверов
В поставке letsencrypt помимо плагина для работы с Apache имеется ряд других, а именно:
- standalone
- webroot
- manual
- nginx
Обновление сертификата
Сертификаты Let’s Encrypt действуют 90 дней. Хорошо это или плохо – спорить бессмысленно, особенно учитывая то, что процесс обновления сертификата очень прост. А именно, для обновления сертификата достаточно выполнить команду
letsencrypt renew
Перенаправление портов
Уверен, это ни у кого затруднений не вызовет, но, для полноты изложения, опишу этот шаг.
План работ
Для получения сертификата и поддержания его актуальности нам понадобится пройти через пять этапов:
Подготовим 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 есть лимиты на количество обращений за сертификатами, потому сначала попробуем получить необходимый сертификат в режиме для тестов:
Продление ssl сертификата
Ранее я уже упоминал о том, что бесплатные SSL сертификаты “живут” только 90 дней, поэтому после их истечения необходимо будет запускать процедуру продления, благо это тоже бесплатно 🙂
Что же из себя представляет процесс продления?
Как утверждают в Let’s Encrypt, перед истечением, на почту, указанную при создании, приходит соответствующее письмо-уведомление о том, что пора бы продлить сертификат. Чтобы это сделать вручную достаточно запустить команду:
$ ./letsencrypt-autoИ следовать инструкциям на экране. Автоматическое же продление можно настроить используя конфигурационный файл и обычный crontab. Желательно настроить крон таким образом, чтобы продление происходило не чаще 1 раза в месяц.
Если вы работаете из под Windows, то letsencrypt можно развернуть, используя Vagrant или Docker. Правда в этом случае для правильной настройки веб-сервера необходимо будет вручную переместить все файлы на сервер.
Продление сертификатов
Сертификаты выдаются на три месяца. Не на полгода, не на год, а лишь на три месяца. Естественно это вызывает вопросы. Нужно ли проходить всю эту процедуру через три месяца? Нужно ли это делать всегда до искончания веков? Может стоит всё-таки вложиться в платный сертификат чтобы забыть об этом всем и не воспоминать пару лет?
Но нет, не спешите искать платежные средства! Как и было обещано в начале статьи, с обновлением сертификатов проблем нет.
Регистрация в let’s encrypt
Регистрацию нужно сделать только один раз:
Установка ssl сертификата для apache
Мой блог работает на связке LAMP, т.е. Linux, Apache, MySQL и PHP. Разработчики Let’s Encrypt постарались на славу и упростили настройку сертификата для Apache до уровня “проще некуда”. Весь процесс сводится к следующим шагам:
Установка в jessie
Если у вас еще в ходу актуальный на конец 2021 года Debian stable “jessie”, то всё лишь немного сложнее.
Вместо заключения
Путём несложных манипуляций с CRD мы научились выписывать автопродляемые, самоподписанные и бесплатные SSL-сертификаты от проекта Let’s Encrypt для доменов сайтов, запущенных в рамках Ingress’ов в Kubernetes-кластерах.
В статье приведены примеры решения наиболее частых в нашей практике задач. Однако функции cert-manager не ограничиваются описанными выше возможностями. На сайте утилиты можно найти примеры работы с другими сервисами — например, связка с Vault или же использование внешних выпускающих центров (issuers).
