Fullchain-сертификаты и как их добыть
Что такое сертификаты безопасности?
Если совсем просто - это самые обычные текстовые файлы с зашифрованными данными внутри, которые позволяют сторонам убедиться, что их "собеседники" на другом конце именно те, за кого себя выдают. Их можно открыть Блокнотом и увидеть что-то вроде:
Таких блоков в файле может быть один или больше, в зависимости от длины цепочки (каждый ключ или подпись - свой блок).
Порядок блоков не имеет значения.
Сертификаты можно разделить на степени - или уровни - доверия.
- Корневые сертификаты. Выпущены специальными удостоверяющими центрами, имеют наивысшую доверительность. Могут удостоверять собой любые другие виды сертификатов.
- Промежуточные сертификаты. Любые виды цепочек сертификатов. Тоже имеют право удостоверять (подписывать) другие сертификаты.
- Конечные сертификаты. Самая низкая степень доверия. Ими нельзя подписывать никакие другие сертификаты.
То есть, сертификаты составляют вертикальные цепочки, в которых более высоким сертификатом удостоверяется (подписывается) более низкий.
Теперь легко понятны ещё два термина:
- fullchain ("полная цепочка") сертификат - тот, который хранит всю цепочку, включая корневой и конечный сертификаты (и все промежуточные, если они участвуют).
Физически fullchain-сертификат - тот же текстовый файл, который хранит все ключи и подписи, участвующие в цепочке. - самозаверенный (чаще говорят "самоподписанный") сертификат - тот, который удостоверяет сам себя на манер корневого сертификата, но при этом, конечно, им не является.
Кроме того, из-за того, что самоподписанные сертификаты невозможно отозвать, возникают различные риски ("атака посредника" итд).
Самоподписанные сертификаты имеют самую низкую надёжность и их использование недопустимо, когда требуется обеспечить безопасный обмен данными.
Сертификат имеет два ключа:
- Публичный (который можно и нужно раздавать всем)
- Приватный (который ни в коем случае нельзя отдавать/посылать. В противном случае ключи обязаны быть немедленно перевыпущены).
Организацию, выпускающую сертификаты (удостоверяющий центр или любую другую) называют издателем. Каждый издатель выкладывает в общий доступ свой публичный ключ, чтобы любой желающий с его помощью мог проверить, действительно ли сертификат подписан именно этим издателем.
И напоследок, у сертификата есть срок действия, после которого пользоваться им не получится. А также сертификат может быть отозван по каким-то причинам (например, скомпрометирован публичный ключ). Сертификат, у которого всё хорошо, называют валидным (действительным) - и наоборот.
Сертификаты в навыках Алисы
Поскольку безопасность и надёжность - ключевые характеристики облачных сервисов (нередко с обменом данными сразу между несколькими провайдерами), это накладывает современные требования к протоколам и сертификатам, в том числе:
- обязательная работа через HTTPS,
- обязательное использование fullchain-сертификатов.
Благо, сегодня вряд ли удастся найти хостинг без поддержки SSL/HTTPS, а полноценные сертификаты легко можно получать бесплатно (да, те самые Lets' Encrypt, SSL For Free, CAcert итд).
Как получить такой сертификат?
Вариантов и инструкций в Интернете достаточно много. В том числе у нас на вики в статье " Алиса управляет Умным домом через Node-RED".
В следующих разделах - краткие инструкции по самым популярным сервисам:
Lets' Encrypt и certbot
Потребуется установить программу certbot. Под *nix- системами это сделать проще, но под Windows тоже не потребуется сверхъестественных усилий.
Инструкции могут сильно отличаться от версии операционной системы, одной страницей тут не обойтись, лучше подобрать подходящий для вашей среды вариант в Интернете. Да и задача этой инструкции в другом: дать общее представление о полных цепочках и объяснить, что делать со сгенерированными файлами, чтобы их получить.
Предположим, что certbot вы установили. Что дальше? Запускаем несколько консольных команд.
Зарегистрироваться:
certbot register -m emailадминистратора@вашдомен.com
Сгенерировать сертификат:
certbot certonly --webroot -w /var/www/папкасервера -d вашдомен.com -d www.вашдомен.com
Если опасаетесь, что что-то не так и хотите сначала потренироваться, добавьте ключ --dry-run (режим эмуляции для отладки ошибок)
certbot certonly --dry-run --webroot -w /var/www/папкасервера -d вашдомен.com -d www.вашдомен.com
Готово! У вас появятся 4 файла (их расположение также сильно зависит от вашей операционной системы):
- cert.pem (конечный сертификат),
- chain.pem (цепочка доверия от корневого сертификата, но не включающая конечный),
- fullchain.pem (нужная нам полная цепочка, включающая конечный сертификат, по сути сложение chain.pem+cert.pem),
- privkey.pem (закрытый ключ конечного сертификата, который никому нельзя ни показывать, ни отсылать).
Для веб-сервера необходимы два из них: fullchain.pem и privkey.pem.
Ещё несколько полезных команд certbot
Проверка и обновление сертификатов (полезно поставить запуск этой команды по расписанию):
certbot -q renew
Для проверки и обновления также есть тестовый режим (чтобы убедиться. что ваши домены будут обновляться):
certbot renew --dry-run
Добавление новых доменов и поддоменов к сертификату:
certbot certonly --webroot -w /var/www/папкасервера --expand -d вашдомен.com -d www.вашдомен.com -d www.вашдомен.ru
Изменение адреса администратора:
certbot register --update-registration -m newemail@вашдомен.ru
SSL For Free
Получить сертификат через онлайн-сервис намного быстрее и проще, ничего устанавливать не нужно:
- Регистрация на сайте https://sslforfree.com/
- Выбор настроек (обычно ничего трогать не нужно, просто жмите "Next Step")
- Подтверждение прав на домен, для которого получаете сертификат, любым из способов:
- на почту его владельца (список готовый, посторонний адрес вписать не получится) - вам должна быть доступен один из почтовых ящиков.
- изменением полей DNS (CNAME) - для новичков этот способ самый запутанный, но не требует доступности почты и http.
- скачиванием подтверждающего файла и размещением его в подпапке сайта - к домену должен быть http-доступ из Интернета в момент проверки.
- сертификат готов!
Сервис SSL For Free создаёт три файла:
- ca_bundle.crt (цепочка, исключая конечный сертификат)
- certificate.crt (сам конечный сертификат)
- private.key (закрытый ключ конечного сертификата, который никому нельзя ни показывать, ни отсылать).
Получить fullchain можно, склеив в любом текстовом редакторе два первых файла. Порядок блоков, как мы помним, значения не имеет, но в интернетах встречается рекомендация "сначала сертификат", можно последовать ей.
Вероятно, вам дополнительно понадобится найти файл root, содержащий подписи корневых удостоверяющих центров.
Средствами Windows, например, при помощи штатной certutil можно получить корневые сертификаты в формате sst ("certutil.exe -generateSSTFromWU roots.sst"), а распаковкой регулярно обновляемого файла authrootstl.cab - в формате stl.
Как понять, что всё хорошо
Очень просто: вы скопировали файлы сертификатов в нужную папку, указали вашему веб-серверу пути к ним, и всё работает! :)
Как понять, что всё плохо
При попытке верифицироваться с неполноценным сертификатом вы получите сообщение "Endpoint URL: Некорректный SSL-сертификат".
Возвращайтесь к началу инструкции, по которой вы его выпускали и проверьте, всё ли вы сделали правильно. Сравните с любой другой инструкцией из Интернета. Возможно, где-то вкралась ошибка, или другое объяснение окажется для вас более полным и понятным.
Как проверить сертификат на валидность
Онлайн
Вот несколько популярных сервисов для онлайн-проверки валидности сертификатов:
Все три англоязычные, все три бесплатные, для всех трёх надо ввести ваш доменный адрес, но первый выводит более красивые картинки и, возможно, это тоже сыграло роль в его популярности в русскоязычном сегменте. Главное - чтобы все пункты были с зелёными крыжиками ) самоподписанные сертификаты этот сервис тоже определяет.
Ни в коем случае никогда и никому не отправляйте файлы, которые содержат ваши приватные ключи!
Офлайн (без доступа к Интернету)
Да, в изолированных сетях и сетях без доступа к Интернету тоже бывают нужны SSL-сертификаты. И значит, должен быть способ их проверки без выхода в Интернет.
Такой способ есть, использует криптографический пакет OpenSSL (что-то вроде "openssl x509 -in myserver.crt -text -noout", "openssl x509 -noout -modulus -in server.crt | openssl md5", "openssl verify -CAfile RootCert.pem -untrusted Intermediate.pem UserCert.pem", итд).
