os.mtls

mTLS-сертификаты для Traefik без CRL, OCSP и лишней боли

Bash-скрипт, который выпускает, продлевает и мгновенно отзывает клиентские сертификаты — без перезагрузки Traefik, без передачи паролей через argv и без сетевых уведомлений.

MIT LicenseBash + OpenSSL + Python3Требует root

Почему это вообще нужно

Traefik не умеет отзывать сертификаты
Добавил клиента в caFiles — и всё, штатного способа заблокировать его без пересборки всего CA нет.
CRL/OCSP — оверинжиниринг
Поднимать инфраструктуру списков отзыва ради 5–20 клиентских сертификатов — избыточно. crl.pem остаётся лишь дополнительным артефактом для внешних потребителей.
Ручное управление не масштабируется
openssl командами на память, файлы разбросаны по серверу, нет истории — кто, когда и зачем выпустил сертификат.

Как работает

CA bundle на сервис + мгновенная пересборка при отзыве

Traefik доверяет не клиентским сертификатам напрямую, а bundle-файлу (caFiles) — общему или отдельному для каждого сервиса. Скрипт управляет содержимым bundle: выпуск клиента добавляет запись, отзыв — удаляет её и пересобирает файл.

File provider Traefik подхватывает изменение сам, поэтому доступ блокируется мгновенно и без перезагрузки. Файл crl.pem — дополнительный артефакт для внешних потребителей, а не основной механизм отзыва.

bundle[api].caFiles ← client.crt (alice)
bundle[api].caFiles ← client.crt (bob)
Гранулярный отзыв
Без reload Traefik
Только openssl и python3

Кому подойдёт

Self-hosted / homelab
Dokploy, Traefik, VPS с несколькими сервисами за mTLS.
Небольшие DevOps-команды
Контроль доступа к внутренним панелям/API без полноценного VPN.
Open-source инфраструктура
Простой bash-инструмент без Go-бинарников и внешних зависимостей.
Traefik + Docker Compose
Работает с shared или per-service CA bundle, hot-reload через file provider.

Что внутри

Управление CA
ca create / info / backup / restore — свой корневой центр сертификации.
Жизненный цикл сертификатов
cert issue / list / renew / verify / scan — без ручного OpenSSL.
Мгновенный отзыв
cert revoke пересобирает CA bundle, доступ блокируется без reload Traefik.
Защищённые PKCS#12
Клиентские .p12-файлы и зашифрованный приватный ключ CA.
Shared / per-service bundle
Общий bundle или отдельный на сервис — гибкая изоляция клиентов.
Сервисы new / patch
service add / list / delete / delete-full с двумя режимами применения.
Именованные пресеты
preset save / apply / list / delete — сохранённые наборы путей и конфигурации.
JSONL-аудит с ротацией
История действий: кто, когда и зачем выпускал или отзывал сертификат.
Безопасные пароли
Пароль OpenSSL передаётся через временный файл 0600, а не через argv/history.
Safe-replace конфигурации
Traefik YAML валидируется перед заменой, исходник сохраняется как .bak.
Блокировка БД
flock защищает состояние от конкурентных запусков.
CI
Bash syntax check, ShellCheck, smoke- и security-тесты на каждый push/PR.

Требования

opensslвыпуск и проверка сертификатов
python3служебная обработка данных
bash ≥4исполнение CLI-скрипта
flockбезопасная блокировка БД
gzipротация audit-лога
root (UID 0)работа с приватным ключевым материалом CA и клиентов

Только Linux. Запуск строго от root — скрипт работает с приватным ключевым материалом.

FAQ