8.0 KiB
Локальная инфраструктура сертификатов (Local PKI)
Набор bash-скриптов и конфигурационных файлов для автоматического создания собственного доверенного центра сертификации (Root CA), промежуточного центра (Intermediate CA) и выпуска универсальных мультидоменных SSL-сертификатов (для Nginx, Nginx Proxy Manager, Docker-сервисов и любых других веб-серверов).
📋 Описание полей сертификата (Subject)
При настройке метаданных сертификатов в файле конфигурации используются следующие стандартные атрибуты:
- CN (Common Name) — Имя создаваемого объекта. Для Root/Intermediate CA указывается понятное название центра (например,
Ixrs Root CA), а для конечных сертификатов — базовый домен организации. - O (Organization) — Название компании или организации (например,
Ixrs). - L (Locality) — Город, населенный пункт или описание сети (например,
Local Network). - C (Country) — Двухбуквенный код страны в формате ISO (например,
RU,EU,US). - ST (State) — Регион, область, штат или край.
- emailAddress — Электронная почта администратора для связи.
📂 Структура проекта и генерируемые файлы
После успешного выполнения всех скриптов структура директории будет выглядеть следующим образом:
.
├── .env # Активный файл конфигурации (копия из .env.example)
│
├── root_ca.ini # Конфигурация OpenSSL для Root CA
├── intermediate_ca.ini # Конфигурация OpenSSL для Intermediate CA
├── issuing_san.ini # Список доменов, поддоменов и IP для конечного сертификата
│
├── build-root-cert.sh # Скрипт сборки Root CA
├── build-intermediate-cert.sh # Скрипт сборки Intermediate CA
├── build-issuing-cert.sh # Скрипт сборки универсального мультидоменного сертификата
│
# ── Сгенерированные файлы (Артефакты) ──────────────────────────────────────────
│
├── root_ca.key # [🔒 SECRET] Приватный ключ Корневого ЦС
├── root_ca.crt # Публичный сертификат Корневого ЦС
├── root_ca.srl # Файл серийных номеров для отслеживания Root CA
│
├── intermediate_ca.key # [🔒 SECRET] Приватный ключ Промежуточного ЦС
├── intermediate_ca.csr # Запрос на подпись (CSR) Промежуточного ЦС
├── intermediate_ca.crt # Публичный сертификат Промежуточного ЦС
├── intermediate_ca.srl # Файл серийных номеров для отслеживания Intermediate CA
│
├── issuing.key # [🔒 SECRET] Исходный приватный ключ доменов
├── issuing.csr # Запрос на подпись (CSR) для конечных доменов
├── issuing.crt # Исходный конечный сертификат (только домены)
│
# ── Готовые контейнеры для веб-серверов (Nginx / NPM / Apache) ─────────────────
│
├── privkey.pem # [🔒 SECRET] Универсальный приватный ключ для веб-сервера
└── fullchain.pem # Полная цепочка (Конечный серт + Промежуточный серт)
⚙️ Настройка окружения
Для конфигурации скриптов используются файлы .env и .ini. Создайте их на основе шаблонов (команда безопасно пропустит копирование, если файлы уже созданы и настроены):
cp -n .env.example .env
cp -n root_ca.ini.example root_ca.ini
cp -n intermediate_ca.ini.example intermediate_ca.ini
cp -n issuing_san.ini.example issuing_san.ini
🚀 Порядок запуска и использования
Перед запуском сделайте скрипты исполняемыми:
chmod +x build-root-cert.sh build-intermediate-cert.sh build-issuing-cert.sh
Шаг 1. Создание Корневого ЦС
Запустите скрипт создания главного сертификата. Если файлы уже существуют, скрипт выведет предупреждение для предотвращения случайной перезаписи.
./build-root-cert.sh
- Скрипт интерактивно спросит, хотите ли вы установить корневой сертификат в системное хранилище доверенных сертификатов ОС (Debian/Ubuntu). В случае согласия он сам запросит права
sudoв нужный момент.
Шаг 2. Создание Промежуточного ЦС
Запустите скрипт создания промежуточного центра, который будет использоваться непосредственно для подписи конечных адресов. Он защищен флагами ограничения области видимости доменов (nameConstraints) и запретом создания цепочек ниже уровнем (pathlen:0).
./build-intermediate-cert.sh
Шаг 3. Выпуск мультидоменного сертификата
Запустите скрипт генерации универсального сертификата. Он подпишет ключ, строго опираясь на правила и список альтернативных имен (DNS и IP) из файла issuing_san.ini.
./build-issuing-cert.sh
- В конце процесса скрипт предложит автоматически собрать универсальные PEM-контейнеры
privkey.pem(приватный ключ) иfullchain.pem(полная цепочка сертификатов), которые готовы к копированию в Nginx, Nginx Proxy Manager, Apache или бэкенд-приложения.
🛡️ Безопасность
- Конфиденциальность ключей: Приватные файлы ключей (
*.keyиprivkey.pem) дают полный контроль над вашей локальной безопасностью. Никогда не передавайте их третьим лицам и ограничьте к ним доступ на машине (chmod 400). - Игнорирование в Git: Обязательно добавьте секретные файлы в
.gitignore, чтобы случайно не отправить личные ключи и доступы в публичный репозиторий.