Внутренний ACME для TLS-сертификатов: офлайн продление
Как построить внутренний ACME для TLS-сертификатов без интернета: архитектура, модель доверия, выпуск и автопродление, мониторинг сроков и аудит.

Проблема: сертификаты истекают и это останавливает сервисы
TLS-сертификаты почти всегда вспоминают в последний момент: когда пользователи видят предупреждение в браузере, API начинает отдавать ошибки, а клиенты VPN не подключаются. Причина простая - ручное продление держится на календаре, внимательности и доступе к нужным системам. Один пропущенный срок, один сотрудник в отпуске, одно забытое промежуточное звено в цепочке - и сервис «падает» не из-за кода, а из-за доверия.
В изолированных контурах проблема острее. «Без выхода в интернет» обычно означает, что узлы не могут:
- обращаться к публичным центрам сертификации и их проверкам;
- публиковать или обновлять записи во внешнем DNS;
- принимать входящие проверки снаружи;
- быстро ставить обновления и инструменты «как в облаке».
При этом сертификаты нужны везде, и чаще всего страдают самые заметные и критичные точки: веб-порталы и внутренние панели, API для интеграций, почтовые серверы, VPN-шлюзы, сервисы аутентификации и админки оборудования.
Когда таких сервисов десятки, ручная схема превращается в лотерею: где-то сертификат обновили, но забыли перезапустить балансировщик; где-то обновили только на одном узле кластера; где-то выдали сертификат с неверным именем. Поэтому внутренний ACME для TLS-сертификатов решает не «красоту процесса», а четыре практичные цели: непрерывность работы, единый контроль выдачи, предсказуемое продление по расписанию и аудит (кто, что, когда и на каких основаниях получил).
ACME в двух словах: роли и логика подтверждения владения
ACME - это протокол, который позволяет выпускать и продлевать TLS-сертификаты автоматически, по понятным правилам. Если говорить просто, есть три роли: клиент (агент на вашем сервере), ACME-сервер (точка, которая принимает запросы) и центр сертификации (CA), который в итоге подписывает сертификат. Клиент просит сертификат, ACME-сервер дает задание на проверку, клиент доказывает, что он правда владеет именем, и после этого CA выпускает сертификат.
Главное отличие ACME от «скрипта, который копирует сертификат» в том, что ACME привязывает выпуск к проверке владения доменом и к учетной записи (account) клиента. Плюс, протокол описывает весь цикл: запрос, проверку, выпуск, продление, отзыв. Это снижает риск «тихого» выпуска сертификатов не туда и помогает держать процесс под контролем.
Обычно используются такие проверки владения именем (challenge):
- HTTP-01: разместить токен по HTTP на домене (удобно, если есть общий входной веб-доступ к сервису).
- DNS-01: создать TXT-запись в DNS (часто самый практичный вариант внутри сегментированных сетей).
- TLS-ALPN-01: отдать токен через TLS на 443 порту (подходит, когда проще поднять временный TLS-ответ).
Внутри закрытого контура чаще всего выигрывает DNS-01: не нужно пробивать HTTP-доступ до каждого сервиса, достаточно управляемого внутреннего DNS.
Где хранится ключ, зависит от политики. Чаще ключ создается и живет на сервере приложения (там же происходит ротация). Для более строгих требований ключ можно генерировать и хранить в HSM или в хранилище секретов, чтобы снизить риск утечки и ограничить доступ администраторов.
Архитектура: из чего состоит внутренний контур ACME
Внутренний ACME для TLS-сертификатов обычно строят как небольшой контур внутри сети: отдельный сервис выдает и продлевает сертификаты, а приложения только запрашивают их и ставят на свои endpoints. Так вы убираете ручной выпуск, но сохраняете контроль.
Базовый набор компонентов выглядит так:
- ACME-сервер в локальной сети: принимает запросы на выпуск, запускает проверку владения именем и отдает готовый сертификат.
- Частный центр сертификации (CA): корневой сертификат хранится максимально изолированно, а выпуск выполняет промежуточный CA.
- DNS и DHCP: помогают держать порядок в именах и IP, а DNS часто используется для подтверждения доменов.
- Хранилище секретов: место, где безопасно хранить ключи аккаунтов ACME, токены автоматизации и, при необходимости, ключи для доступа к DNS.
- Точки интеграции: те места, где сертификат реально нужен.
Разделение CA на корневой и промежуточный важно: если промежуточный ключ утечет, вы можете отозвать и перевыпустить только его, не перестраивая доверие во всей организации. Корень при этом лучше держать офлайн или в сильно ограниченном сегменте.
DNS и DHCP становятся частью доверия: если кто-то может самовольно создавать записи, он сможет проходить проверку и получать сертификаты. Поэтому права на зоны, обновления и журналы изменений должны быть понятны и ограничены.
Интеграции обычно делаются через стандартные клиенты ACME и автоматическую перезагрузку конфигурации, например для:
- веб-серверов и API
- балансировщиков
- Kubernetes ingress
- reverse proxy
- почтовых и внутренних порталов
В закрытых контурах (например, в дата-центрах госорганизаций или банков) такой подход помогает поддерживать короткие сроки сертификатов без зависимости от интернета.
Доверие и контроль: как не превратить внутренний CA в "печатный станок"
Внутренний ACME для TLS-сертификатов снимает ручную работу, но добавляет риск: если правила выпускa слабые, любой сервис сможет получить сертификат на чужое имя. Поэтому в центре внимания не скорость, а доверие и контроль.
Начните с простого принципа: корневой центр (Root CA) должен быть максимально недоступен. Его держат офлайн, включают только для выпуска или ротации промежуточных центров, а доступ дают узкому кругу администраторов по регламенту. Закрытый сейф, отдельная машина без сети, журнал действий и двух человек на критические операции часто дают больше безопасности, чем сложные схемы.
Рабочей лошадкой становится промежуточный CA. Он подписывает сертификаты для ACME, живет короче (например, 1-3 года) и проще отзывается при инциденте. Важно заранее продумать ротацию: новый intermediate выпускается заранее, доверие обновляется на клиентах, затем старый выводится из обращения.
Доверие к внутреннему корню нужно раздать управляемо: на ПК и серверы через доменные политики, на мобильные через MDM, на тонкие клиенты через базовый образ или централизованную конфигурацию. Отдельно проверьте устройства в медицине и производстве, где обновления могут быть редкими.
Политики, которые держат систему в руках
Хорошая политика выпуска обычно отвечает на пять вопросов:
- Кто имеет право запрашивать выпуск (группы, сервисные аккаунты, сетевые сегменты).
- Какие имена разрешены: только ваш внутренний DNS-зонный список, запрет внешних доменов.
- Разрешены ли wildcard и какие именно (часто их стоит ограничить).
- Какие SAN допустимы (например, только внутри конкретного проекта или подразделения).
- Максимальные сроки и частота перевыпуска, чтобы не плодить "вечные" сертификаты.
Аудит: что должно оставаться в следах
Логи должны показывать цепочку: кто запросил сертификат, каким способом подтвердил владение именем, что именно выдано (CN/SAN, срок, отпечаток), и кто одобрил, если у вас есть ручной шаг. В закрытой сети, например у госзаказчика или банка, это помогает быстро ответить на вопрос "почему этот сервис получил сертификат" и вовремя остановить неправильные заявки.
Как подтверждать домены внутри: DNS, HTTP и особенности сегментации
Внутренний ACME для TLS-сертификатов упирается в одно: как доказать, что сервис действительно владеет именем, если сеть изолирована и правила доступа жесткие. Внутри контура чаще всего побеждает DNS-01, потому что он не требует прямого HTTP-доступа к сервису и хорошо работает через сегменты.
DNS-01 обычно становится базовым вариантом: ACME-клиент кладет временную TXT-запись в вашу внутреннюю DNS-зону, а ACME-сервер проверяет ее через корпоративный DNS. Это удобно, если у вас много сервисов, балансировщики, NAT и закрытые порты.
HTTP-01 тоже возможен в изолированном контуре, но он капризнее. Он подходит, когда ACME-сервер может дойти по HTTP до конкретного хоста и пути проверки, а маршрутизация и прокси не меняют запрос. Он мешает, если сервисов много, адреса плавают, все сидит за одним reverse proxy, или доступ из зоны ACME к DMZ закрыт.
Полезная развилка выглядит так:
- DNS-01: лучший выбор для закрытых сетей, DMZ, балансировщиков и wildcard
- HTTP-01: проще для одиночных сервисов, где есть прямой маршрут и стабильный URL
- Wildcard: удобно для микросервисов, но требует строгого контроля прав на выпуск
Wildcard-сертификаты (например, для *.corp.local) сокращают количество выпусков, но снижают точность контроля: один ключ может открыть доступ сразу ко многим именам. Поэтому их обычно дают только платформенным командам и только для отдельных зон.
Сегментация важна: для DMZ и внутренних зон задайте разные политики (кто может запрашивать, на какие домены, с каким сроком). Хорошая практика - отдельные аккаунты ACME и разные профили выдачи для сетей с разным уровнем риска.
Чтобы не получить "шторм" продления, введите лимиты:
- ограничение частоты выпуска на домен и на команду
- джиттер (случайный сдвиг) в расписании продлений
- блокировку массового выпуска при аварии DNS
- обязательное подтверждение для wildcard в чувствительных зонах
Например, в закрытой сети больницы сервисы в DMZ подтверждают имена через DNS-01, а внутренние панели админов получают отдельную зону и более строгие лимиты, чтобы один сбой автоматизации не остановил всю инфраструктуру.
Варианты развертывания без интернета: полностью офлайн и полуофлайн
Для внутреннего ACME для TLS-сертификатов чаще всего выбирают один из двух режимов: полностью офлайн, когда весь контур живет внутри закрытой сети, или полуофлайн, когда есть строго контролируемый "мост" только для обновлений и политик.
Полностью офлайн
В этой схеме внутри периметра находятся: частный центр сертификации (root и чаще всего отдельный intermediate), ACME сервер, база данных ACME, DNS (если вы делаете DNS-01), а также клиенты на сервисах (например, Certbot или встроенные ACME-клиенты в прокси). Никаких внешних проверок, никаких обращений к публичным DNS и никакой зависимости от внешних репозиториев.
Главный плюс - предсказуемость и безопасность. Главный минус - обновления и исправления вы делаете сами и по плану.
Полуофлайн с "мостом"
Здесь контур выпуска сертификатов остается изолированным, но появляется выделенный узел или процесс, который по расписанию привозит внутрь: обновления ОС и пакетов, новые версии ACME, списки отзыва, шаблоны конфигураций и изменения политик. Этот "мост" должен быть односторонним по смыслу: он доставляет внутрь, а не "публикует наружу".
Обновления лучше проводить окнами и сначала на стенде. Не меняйте одновременно CA, ACME и клиентов: так сложнее понять, что сломалось.
Для резервного копирования заранее решите, что восстанавливается быстро, а что перевыпускается:
- конфигурации CA и ACME, политики, профили сертификатов
- база данных ACME (аккаунты, заказы, статусы)
- журналы аудита и события выпуска и отзыва
- конфиги DNS и HTTP-челленджей (если они ваши)
- хранилища ключей только в защищенном виде (HSM, зашифрованные бэкапы)
План восстановления должен включать минимум три сценария: утечка ключа intermediate, компрометация узла ACME, ошибочный массовый выпуск. В каждом случае заранее определите, кто дает команду на отзыв, как быстро распространяются CRL/OCSP внутри, и как организован форсированный перевыпуск на критичных сервисах (например, в закрытой сети предприятия или дата-центра, который интегратор вроде GSE.kz обслуживает по SLA).
Пошагово: как внедрить внутренний ACME и включить автопродление
Начните с простого: какие имена вы будете выпускать и как долго должен жить сертификат. Зафиксируйте доменные зоны (например, *.corp.local, *.svc.intra), список критичных сервисов и правила: срок действия, минимальный остаток до продления, требования к ключам (RSA или ECDSA), где хранить ключи.
Дальше важно построить цепочку доверия. Создайте root CA (лучше держать офлайн) и intermediate CA для повседневной выдачи. В политиках задайте: какие имена разрешены, какие поля обязательны, кто имеет право запрашивать сертификаты, и как вы будете отзывать их при компрометации.
Когда CA готов, разверните внутренний ACME для TLS-сертификатов: ACME-сервер в локальной сети, который принимает запросы от клиентов, проверяет владение именем и выпускает сертификат через ваш intermediate CA. Отдельно продумайте журналирование и аудит: кто запросил, для какого имени, с какого хоста.
Практический план внедрения обычно выглядит так:
- Описать доменные зоны, стандарты имен и требования по срокам.
- Поднять root и intermediate CA и утвердить политики выпуска.
- Развернуть ACME-сервер и подключить его к intermediate CA.
- Настроить DNS-автоматизацию для DNS-01: какой сервис меняет записи и под какой учеткой.
- Настроить ACME-клиенты на серверах приложений и безопасную перезагрузку сервисов после обновления.
Завершите тестом: выпустите сертификат для одного непубличного сервиса, проверьте цепочку доверия на клиентах, затем дождитесь планового продления (или сократите порог) и убедитесь, что обновление проходит без простоя. После этого включайте регулярное продление для остальных сервисов по группам, начиная с менее критичных.
Контроль сроков: мониторинг, оповещения и отчетность
Автопродление не отменяет контроля. Внутренний ACME для TLS-сертификатов снимает ручную работу, но добавляет новую задачу: быстро замечать сбои в цепочке (ACME сервер, challenge, выпуск, доставка, перезапуск сервиса) до того, как сертификат истечет.
Что стоит измерять и держать на одном экране:
- Дни до истечения по каждому имени (и отдельно по критичным сервисам)
- Процент успешных продлений за 24 часа и за 7 дней
- Частые причины провалов: DNS/HTTP challenge, недоступность ACME, ошибки прав
- Возраст сертификатов и доля тех, что обновились не по графику
- Время от запроса до установки сертификата на узле
Проверять лучше в двух местах. Централизованно - чтобы видеть общую картину по всем сегментам. И локально на узлах - чтобы поймать ситуацию, когда сертификат выпущен, но не применился (файл не обновился, сервис не перезапустился, перепутан путь к хранилищу).
Оповещения задайте простыми порогами: 30/14/7/1 день до истечения. На 30 дней достаточно уведомления владельцу сервиса. На 7 и 1 день - дежурной смене и тем, кто отвечает за DNS/прокси, чтобы не терять время на согласования.
Для разборов нужны журналы: выпуск и отзыв сертификата, попытки challenge, изменения DNS-записей, перезапуски веб-серверов и балансировщиков. Раз в месяц делайте аудит: список активных сертификатов, где установлены, кто владелец, и какие имена больше не нужны. Это снижает риск, что внутренний CA превратится в неконтролируемую выдачу "на все подряд".
Частые ошибки и ловушки при внутреннем ACME
Внутренний ACME для TLS-сертификатов часто внедряют «как в интернете», а потом удивляются, что стало даже опаснее. Ниже ошибки, которые встречаются чаще всего, и почему они реально бьют по безопасности и стабильности.
Ошибки, которые ломают управляемость
Самая популярная ловушка - выпускать слишком долгоживущие сертификаты «на всякий случай». Кажется, что так меньше шансов на простой, но на деле вы теряете контроль: компрометация ключа становится проблемой на годы, а не на недели.
Еще одна крайность - один wildcard на все сервисы. Это удобно, пока не утек приватный ключ. Тогда под угрозой сразу весь контур, и вы не можете ограничить ущерб по сегментам или командам.
Проблемы часто начинаются и с доверия: root CA раздают «кому надо» без учета мобильных ноутбуков, изолированных рабочих мест и временных подрядчиков. В итоге где-то доверие не установлено (сервисы падают), а где-то установлено слишком широко (растет риск подмены).
Ошибки в хранении и эксплуатации
Технически внутренний ACME сервер в локальной сети работает, но процессы вокруг него хромают:
- приватные ключи попадают в общие папки, артефакты сборки или CI-логи
- нет плана отзыва и быстрой замены при компрометации
- автопродление включили, но не проверили, что сервис перечитывает сертификат (нужен reload или перезапуск)
Простой пример: сертификат обновился ночью, а утром часть клиентов видит старый, уже просроченный цепочкой, потому что прокси не перечитал файлы. Поэтому автопродление всегда дополняют тестом перезагрузки и проверкой «что реально отдает сервис».
Короткий чек-лист перед запуском в эксплуатацию
Перед тем как включать автопродление в проде, проверьте не только сам ACME сервер, но и организационные вещи. Ошибки чаще всего не в криптографии, а в том, что никто не понимает, где живут сертификаты и кто за них отвечает.
5 проверок, которые экономят недели
- Соберите инвентаризацию всех TLS-точек: веб и API, reverse proxy, ingress, брокеры очередей, базы данных, почта, внутренние панели. Если что-то забыть, оно и упадет первым.
- Определите владельцев доменов и правила выдачи: какие имена разрешены, кто может запрашивать wildcard, какие команды или сервис-аккаунты имеют право выпускать сертификаты.
- Разведите роли CA: Root CA держите изолированным (и используйте редко), а intermediate CA сделайте ротационным, с коротким сроком жизни и минимальными правами. Проверьте, что ключи защищены и есть понятный порядок замены.
- Выберите один основной challenge и отработайте его до автоматизма. В закрытых сетях обычно выигрывает DNS challenge, но важно заранее проверить права на изменение зон, задержки обновления и сегментацию между ACME, DNS и клиентами.
- Настройте контроль сроков: метрики, оповещения, отчеты, плюс тест аварийного продления (например, искусственно сократить срок тестового сертификата и убедиться, что цепочка продления работает).
Документы и аварийные действия
Зафиксируйте процесс отзыва и срочной замены сертификатов: кто принимает решение, как быстро обновляются trust stores, и как откатиться, если новый сертификат не принимается клиентами. Это должно быть понятно дежурной смене, а не только автору внедрения.
Пример сценария: закрытая сеть и десятки внутренних сервисов
Представим банк или больницу с закрытым контуром: интернет на серверах приложений запрещен, доступ есть только через внутренние сегменты, а простои недопустимы. Внутри работают десятки сервисов: регистратура, личный кабинет, электронный документооборот, API для интеграций, панели администрирования.
Имена обычно живут в внутреннем DNS. Часто есть отдельная зона для приложений, чтобы не смешивать серверные имена и пользовательские: например, apps.corp для веб-сервисов и infra.corp для инфраструктуры. Это помогает и с политиками доступа, и с тем, кто имеет право менять записи.
Дальше включается внутренний ACME для TLS-сертификатов. В контуре поднимают частный центр сертификации и ACME-сервер в локальной сети, а на каждом сервисе ставят ACME-клиент. Для подтверждения владения доменом выбирают DNS-01: клиент создает временную TXT-запись в внутреннем DNS, ACME-сервер ее проверяет и выпускает сертификат.
Обычно процесс выглядит так:
- ACME-клиент раз в сутки проверяет срок действия и запускает продление заранее.
- При успехе он кладет новый сертификат в нужный каталог.
- Сервис (например, веб-сервер) получает мягкий перезапуск, чтобы подхватить ключи без простоя.
Контроль сроков делают не вручную, а через дашборд в мониторинге: видно, сколько сертификатов истекает в 30, 14 и 7 дней. Алерты уходят дежурным, а раз в месяц формируется короткий отчет для ИБ и владельцев систем.
Для команды это заметная разница: меньше ночных аварий из-за просроченных сертификатов, меньше ручных заявок, больше предсказуемости. В таком сценарии CA и ACME-сервер часто размещают на выделенных локальных серверах (например, на стойке в ЦОД), чтобы все работало стабильно и без зависимости от внешних каналов.
Следующие шаги: пилот, масштабирование и поддержка
Начните не с установки ACME, а с учета. Соберите список сервисов, которые уже используют TLS, и тех, кто планирует включить HTTPS в ближайшие месяцы. Важно сразу назначить владельцев: кто отвечает за доменные зоны, кто за DNS, кто за балансировщики и кто будет получать уведомления.
Дальше выберите целевую модель: полностью офлайн (вся цепочка внутри) или полуофлайн (например, редкая синхронизация политик и обновлений через контролируемый шлюз). Решение влияет на план миграции: где хранить корневой ключ, как обновлять доверие на рабочих станциях и серверах, как выпускать сертификаты для старых приложений.
Перед пилотом проверьте, что инфраструктура готова к ежедневной эксплуатации:
- Разделение ролей: CA, ACME и мониторинг не должны жить в одной точке без причин
- Резервное копирование: ключи, конфигурации, журналы, база выданных сертификатов
- Наблюдаемость: метрики выдачи, ошибки валидации, рост числа запросов
- Контроль доступа: минимум прав для сервисных аккаунтов, аудит действий
- План аварийных действий: что делать при компрометации ключа или сбое ACME
Пилот делайте на 2-3 сервисах с разной природой: один веб-сервис за балансировщиком, один внутренний API, один сервис в отдельном сегменте. Так быстрее выявятся проблемы с DNS, маршрутизацией и политиками. Зафиксируйте, сколько времени занимает выпуск, продление и раскатка сертификата, и кто реально участвует в процессе.
Масштабирование лучше вести волнами: по доменным зонам или по командам-владельцам. Для каждой волны заранее готовьте шаблоны политик (сроки, SAN, допустимые ключи, правила именования), а также критерии приемки: автопродление работает, мониторинг видит сроки, инциденты разбираются по логам.
Если нужна помощь в проектировании и внедрении, логично подключить системного интегратора. Например, GSE.kz может помочь собрать целевую схему под ваш контур, подобрать серверную платформу для CA и ACME (включая локально произведенные серверы), настроить мониторинг и организовать поддержку 24/7 с понятной зоной ответственности.
FAQ
Что такое внутренний ACME?
Внутренний ACME автоматизирует выпуск и продление TLS-сертификатов внутри вашей сети. Он особенно полезен, когда серверы не имеют выхода в интернет, а сертификаты нужны для порталов, API, VPN и других сервисов.
Можно ли продлевать сертификаты без интернета?
Да. Для этого используют частный центр сертификации и ACME-сервер, размещенные внутри контура. Проверка имен, выпуск сертификатов и их установка проходят через внутренние DNS, сеть и учетные записи.
Какой способ проверки домена лучше выбрать?
В закрытых сетях обычно выбирают DNS-01. Клиент временно создает TXT-запись во внутренней DNS-зоне, а ACME-сервер проверяет ее. Этот способ не требует доступа по HTTP к каждому сервису.
Зачем разделять Root CA и промежуточный CA?
Корневой центр сертификации храните отдельно, желательно офлайн, и используйте только для выпуска промежуточных CA. Повседневную выдачу поручите промежуточному CA, чтобы при инциденте не менять доверие сразу на всех устройствах.
Как устройства начнут доверять внутренним сертификатам?
Раздайте корневой сертификат через доменные политики, MDM, базовые образы или централизованную конфигурацию. Затем проверьте доверие на серверах, рабочих станциях, мобильных устройствах и старом специализированном оборудовании.
Как не дать сервисам получать сертификаты на чужие имена?
Ограничьте разрешенные DNS-зоны, SAN и сроки действия. Выдавайте права сервисным аккаунтам по минимуму, разделяйте политики для разных сегментов и записывайте в журнал каждый запрос, способ проверки и выданный сертификат.
Стоит ли использовать wildcard-сертификаты?
Wildcard удобен, когда одной команде нужно обслуживать много имен в одной зоне. Но один скомпрометированный ключ затрагивает сразу несколько сервисов, поэтому ограничивайте такие сертификаты отдельными зонами и владельцами.
Что нужно мониторить после включения автопродления?
Настройте централизованный контроль дней до истечения, успешных и неуспешных продлений, ошибок DNS-проверки и времени установки нового сертификата. Полезно проверять сам сервис снаружи его узла, чтобы увидеть, какой сертификат он действительно отдает.
Почему сертификат мог не обновиться на сервисе?
Проверьте права на изменение DNS, доступность ACME-сервера, корректность имени в запросе и журналы challenge. Если сертификат уже выпустился, убедитесь, что клиент сохранил его по нужному пути и перезагрузил веб-сервер, прокси или балансировщик.
С чего начать пилот внутреннего ACME?
Начните с двух или трех сервисов: например, веб-приложения за балансировщиком, внутреннего API и сервиса в отдельном сегменте. Протестируйте выпуск, автоматическое продление, перезагрузку без простоя, мониторинг и отзыв, затем подключайте остальные сервисы по группам.