Skip to content

Сертификат HTTPS

Пока на порт стримера не повешен сертификат, он отдаёт обычный HTTP. Эта страница проходит весь путь от голой коробки до работающего https:// — и разбирает причины, по которым выписка не начинается.

Сертификаты живут на стримерах, и каждый выписывает себе сам: чужих приватных ключей central не хранит. То, что вы здесь задаёте, — это документ настроек стримера, поэтому переустановку машины он переживает.

Что нужно до начала

Let's Encrypt не выпишет ничего, пока не выполнены все три условия:

  • Доменное имя. На голый IP-адрес ACME сертификат не выпишет — https://45.41.213.34 не получить ни у одного публичного CA. Нужно имя, которым вы управляете.
  • DNS уже указывает на этот стример. Удостоверяющий центр резолвит имя и подключается к тому, кто ответит. Направьте A/AAAA-запись на машину до того, как просить сертификат, а не после.
  • Порт 443 доступен из интернета. Именно здесь чаще всего ошибаются, поэтому стоит точно сказать, как работает проверка.

Catena проверяет владение через TLS-ALPN-01: ответ отдаётся внутри TLS-хендшейка, на том же порту, что и боевой трафик. Отсюда два следствия:

  • Порт 80 не нужен вовсе. Нет ни HTTP-роута для проверки, ни чего-то, что надо открывать или редиректить. Если интуиция говорит «Let's Encrypt требует порт 80» — это про другой тип проверки, и здесь он не используется.
  • Порт обязан быть 443. Боевой CA выполняет TLS-ALPN-01 только против порта 443. Сертификат, настроенный на 8443, не выпишется никогда: он останется в состоянии «выписывается» без ошибки, потому что CA до него просто не дойдёт. Форма об этом предупреждает, но именно так застревают чаще всего.

TLS-ALPN-01 не переживает и прокси, который терминирует TLS перед стримером: хендшейк должен доходить до самого стримера.

Включение автоматической выписки означает принятие абонентского соглашения Let's Encrypt: при первом обращении стример регистрирует ACME-аккаунт.

Выписать сертификат Let's Encrypt

Откройте стример из реестра и пролистайте карточку до секции Сертификаты.

Секция сертификатов до первой записи

Нажмите Включить HTTPS. Одно действие проходит всю цепочку предусловий: заводит листенер на порту 443 и вешает на него запись Let's Encrypt. Сертификат всегда живёт на порту — поэтому листенер и нужен первым, и поэтому кнопка заводит его за вас.

Теперь заполните запись:

Запись Let's Encrypt с доменами и контактным e-mail

  • Домены — через запятую. Это имена, которые покроет сертификат, и по ним же клиенты выбирают его через SNI. Под полем форма предлагает имя хоста из адресов самого стримера; это именно предложение и применяется только по клику, поэтому пустое поле честно означает, что имя ещё не задано.
  • Контактный e-mail ACME — обязателен. Без него ничего не выпишется, и кнопка Сохранить изменения остаётся неактивной. На него же CA шлёт предупреждения об истечении.

Раздел Дополнительно трогать не нужно: пустой адрес каталога ACME означает боевой Let's Encrypt.

Ряд портов выше показывает результат — чип с пометкой tls означает порт с сертификатом:

Ряд листенеров с TLS-портом

Нажмите Сохранить изменения. Настройки уедут на машину; трасса применения показывает, куда они дошли.

Проверить результат

Состояние выписки видно рядом с самой записью и повторяется карточкой сертификатов вверху карточки стримера. Состояний три, и они не пересекаются:

  • выписывается — заказ в работе. Нормальное состояние первые секунды после сохранения.
  • выписан — со сроком до истечения; за две недели до него строка желтеет. Продление автоматическое и подменяет сертификат без ребинда порта, поэтому соединения не рвутся.
  • не выписан — с причиной, дословно от CA.

Неудавшаяся выписка с причиной

Запись, по которой сертификат ещё не выписан, не обслуживает ничего: хендшейк на её домены отклоняется, а не отвечает чужим сертификатом.

Отправить зрителей по https

Сертификат на порту сам по себе не меняет адреса, которые выдаются плеерам. Если Публичный payload URL в секции Подключение и доставка остался http://, зрителей по-прежнему отправляют по открытому протоколу, и сертификат не используется — форма прямо об этом говорит. Переключите базу на https:// с именем, которое покрыто сертификатом.

То же касается URL API стримера: после первого сертификата вызовы самого central стоит перевести на https://.

Свой сертификат

Выберите источником записи Статический PEM, если сертификат получен где-то ещё — у корпоративного CA, у платного, или это wildcard, который вы выпустили сами.

Оба поля принимают либо текст PEM целиком, либо путь к файлу на стримере:

  • Вставьте PEM — и central разнесёт его по машинам. Так один wildcard-сертификат раздаётся на много стримеров, и это единственный способ использовать wildcard здесь вообще: ACME выдаёт их только через DNS-01, а его Catena не делает.
  • Укажите пути — и стример прочитает файлы с диска. Ротируйте их Ansible или чем угодно ещё: стример перечитает файлы без перезапуска и без обрыва соединений.

Учитывайте, чем оборачивается вставка PEM: приватный ключ тогда лежит в документе настроек стримера и возвращается API целиком при чтении. Доступ на чтение этого документа равен доступу на запись конфигурации — обращайтесь с ним соответственно.

Самоподписанный сертификат для стенда

Самоподписанный заставляет стример сгенерировать сертификат самому. Ему не нужны ни DNS, ни доступный снаружи порт, ни CA, поэтому это способ попробовать TLS во внутреннем контуре, где ACME недоступен в принципе. Клиенты покажут предупреждение о доверии — это ожидаемо, и именно поэтому вариант не продакшновый.

Самоподписанный сертификат никогда не подставляется вместо неудавшейся выписки Let's Encrypt. Ошибка остаётся видимой ошибкой, а не тихо превращается в предупреждение у каждого зрителя.

Ограничения, о которых надо знать

Let's Encrypt разрешает 50 сертификатов на registered domain за 7 дней, и лимит считается глобально по всем аккаунтам. То, что каждый стример выписывает себе сам, его не обходит: сотня стримеров под одним example.com упрётся в потолок на первичной раскатке, а восполняется он примерно семью в день. Штатные продления — около десятка в неделю на такой кластер — идут сильно ниже потолка.

Если первичная раскатка больше лимита:

  • получите один wildcard-сертификат сами и раздайте его как Статический PEM;
  • либо укажите в поле Адрес каталога ACME другой CA — это поддерживаемый путь, а не обходной;
  • либо запросите у Let's Encrypt увеличение лимита — за недели до раскатки.

Для стендов используйте тумблер Тестовый CA (staging) в разделе Дополнительно: он выпишет недоверенный сертификат, зато не тратит боевой лимит. Смена CA начинает выписку с нуля — аккаунт и материал хранятся отдельно по каждому адресу каталога, поэтому staging-аккаунт никогда не попадёт к боевому CA.

Одно следствие выбора сертификата по SNI: сертификата по умолчанию нет. Запрос на TLS-порт по IP-адресу или с неизвестным именем получает отказ в хендшейке. Проверки живости, которые ходят на порт по IP, перестанут работать — направьте их на имя, покрытое сертификатом.

Если выписка не начинается

Вечное «выписывается». По убыванию вероятности: запись не на порту 443; DNS домена не резолвится на этот стример; порт 443 закрыт снаружи; перед стримером что-то терминирует TLS.

Сохранение отклонено. Запись letsencrypt без контактного e-mail отвергается целиком — стример отвечает, что у листенера «has a letsencrypt tls entry but no acme section is configured». Заполните e-mail. Две записи на одном порту с одинаковым доменом тоже отвергаются, как и статическая запись с сертификатом, но без приватного ключа.

Отвергается сам порт. Ошибка показывается рядом с тем портом, который её вызвал. Обычная причина — порт уже занят другим процессом на машине.

После включения HTTPS консоль перестала открываться. Документ настроек владеет списком портов целиком: как только в нём появился хоть один листенер, начальный порт коробки перестаёт действовать. Если все HTTP-порты в нём под TLS, обычный HTTP перестаёт отвечать — а на машине с central консоль отдаётся именно с этих портов. Форма предупреждает, когда в списке не осталось обычного порта; держите обычный HTTP-порт рядом с 443, если только вам сознательно не нужен один HTTPS.

Сертификат выписан, а зрители всё равно идут по http. Адреса доставки от сертификата не зависят — см. Отправить зрителей по https.