Root CA, Intermediate CA и End-Entity сертификаты

В основе любой системы цифровых сертификатов лежит иерархическая модель доверия. Она позволяет масштабировать проверку подлинности, делегировать полномочия и минимизировать риски компрометации. В этой модели участвуют три ключевых типа сертификатов:

  • Root CA (корневой центр сертификации)
  • Intermediate CA (промежуточный центр сертификации)
  • End-Entity (конечный сертификат)

Библиотека jsrsasign предоставляет инструменты для генерации, подписи и проверки всех этих типов сертификатов, включая построение цепочек доверия.


Root CA: корень доверия

Корневой сертификат — это верхний уровень иерархии. Он самоподписан и выступает в роли якоря доверия.

Ключевые свойства

  • Самоподписанный (issuer === subject)
  • Закрытый ключ хранится в максимально защищённой среде
  • Используется только для подписи промежуточных сертификатов
  • Распространяется через доверенные хранилища (браузеры, ОС)

Генерация Root CA с помощью jsrsasign

const rs = require('jsrsasign');

// Генерация ключевой пары
const kp = rs.KEYUTIL.generateKeypair("RSA", 2048);

// Параметры сертификата
const cert = new rs.KJUR.asn1.x509.Certificate({
  version: 3,
  serial: { int: 1 },
  sigalg: "SHA256withRSA",
  issuer: { str: "/C=US/O=MyRootCA/CN=RootCA" },
  subject: { str: "/C=US/O=MyRootCA/CN=RootCA" },
  notbefore: "20240101000000Z",
  notafter: "20340101000000Z",
  sbjpubkey: kp.pubKeyObj,
  ext: [
    { extname: "basicConstraints", cA: true, critical: true },
    { extname: "keyUsage", critical: true, names: ["keyCertSign", "cRLSign"] }
  ],
  cakey: kp.prvKeyObj
});

// Подписание
cert.sign();

// PEM-представление
const rootCertPEM = cert.getPEM();

Особенности

  • Расширение basicConstraints обязательно содержит cA: true
  • keyUsage включает keyCertSign
  • Срок действия обычно длительный (10–20 лет)

Intermediate CA: делегирование доверия

Промежуточный центр сертификации используется для разграничения ответственности и защиты Root CA. Root CA подписывает Intermediate CA, а тот уже выпускает конечные сертификаты.

Зачем нужен Intermediate CA

  • Изоляция Root CA от прямого использования
  • Возможность отзыва без компрометации корневого сертификата
  • Масштабируемость инфраструктуры

Генерация Intermediate CA

// Генерация ключей
const intKP = rs.KEYUTIL.generateKeypair("RSA", 2048);

// Создание сертификата
const intCert = new rs.KJUR.asn1.x509.Certificate({
  version: 3,
  serial: { int: 2 },
  sigalg: "SHA256withRSA",
  issuer: { str: "/C=US/O=MyRootCA/CN=RootCA" },
  subject: { str: "/C=US/O=MyIntermediateCA/CN=IntermediateCA" },
  notbefore: "20240101000000Z",
  notafter: "20300101000000Z",
  sbjpubkey: intKP.pubKeyObj,
  ext: [
    { extname: "basicConstraints", cA: true, critical: true, pathLen: 0 },
    { extname: "keyUsage", critical: true, names: ["keyCertSign", "cRLSign"] }
  ],
  cakey: kp.prvKeyObj // ключ Root CA
});

intCert.sign();

const intCertPEM = intCert.getPEM();

Особенности

  • issuer указывает на Root CA
  • pathLen ограничивает глубину цепочки
  • Подписывается закрытым ключом Root CA

End-Entity: конечный сертификат

Конечный сертификат используется для идентификации серверов, пользователей или устройств. Он не может подписывать другие сертификаты.

Основные характеристики

  • cA: false
  • Используется для TLS, подписи кода, аутентификации
  • Подписывается Intermediate CA

Генерация End-Entity сертификата

// Генерация ключей
const eeKP = rs.KEYUTIL.generateKeypair("RSA", 2048);

// Создание сертификата
const eeCert = new rs.KJUR.asn1.x509.Certificate({
  version: 3,
  serial: { int: 3 },
  sigalg: "SHA256withRSA",
  issuer: { str: "/C=US/O=MyIntermediateCA/CN=IntermediateCA" },
  subject: { str: "/C=US/O=MySite/CN=example.com" },
  notbefore: "20240101000000Z",
  notafter: "20250101000000Z",
  sbjpubkey: eeKP.pubKeyObj,
  ext: [
    { extname: "basicConstraints", cA: false },
    { extname: "keyUsage", critical: true, names: ["digitalSignature", "keyEncipherment"] },
    { extname: "subjectAltName", array: [{ dns: "example.com" }] }
  ],
  cakey: intKP.prvKeyObj // ключ Intermediate CA
});

eeCert.sign();

const eeCertPEM = eeCert.getPEM();

Цепочка сертификатов (Certificate Chain)

Цепочка представляет собой последовательность:

End-Entity → Intermediate CA → Root CA

Каждый сертификат подписан предыдущим уровнем:

  • End-Entity подписан Intermediate
  • Intermediate подписан Root
  • Root самоподписан

Проверка цепочки в jsrsasign

const x509 = new rs.X509();

// Загрузка сертификатов
x509.readCertPEM(eeCertPEM);
const eePubKey = x509.getPublicKey();

const intX509 = new rs.X509();
intX509.readCertPEM(intCertPEM);

const rootX509 = new rs.X509();
rootX509.readCertPEM(rootCertPEM);

// Проверка подписей
const isEEValid = x509.verifySignature(intX509.getPublicKey());
const isIntValid = intX509.verifySignature(rootX509.getPublicKey());

console.log(isEEValid && isIntValid);

Расширения X.509 и их роль

basicConstraints

  • Определяет, является ли сертификат CA
  • Root и Intermediate: cA: true
  • End-Entity: cA: false

keyUsage

Ограничивает допустимые операции:

  • Root/Intermediate: keyCertSign, cRLSign
  • End-Entity: digitalSignature, keyEncipherment

subjectAltName

Используется в TLS для указания доменных имён.


Безопасность и практики

Root CA

  • Хранение в офлайн-среде (HSM)
  • Минимальное использование
  • Долгий срок действия

Intermediate CA

  • Используется в онлайн-инфраструктуре
  • Может быть отозван
  • Делегирует выпуск сертификатов

End-Entity

  • Короткий срок действия
  • Частая ротация
  • Используется в реальных приложениях

Формирование PEM-цепочки

Для передачи клиенту часто объединяют сертификаты:

-----BEGIN CERTIFICATE-----
End-Entity
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
Intermediate
-----END CERTIFICATE-----

Root CA обычно не включается, так как уже находится в доверенном хранилище.


Работа с CSR (Certificate Signing Request)

End-Entity может сначала создать CSR:

const csr = new rs.KJUR.asn1.csr.CertificationRequest({
  subject: { str: "/C=US/O=MySite/CN=example.com" },
  sbjpubkey: eeKP.pubKeyObj,
  sigalg: "SHA256withRSA",
  sbjprvkey: eeKP.prvKeyObj
});

const csrPEM = csr.getPEM();

Intermediate CA затем подписывает CSR и выпускает сертификат.


Отзыв сертификатов

В реальной инфраструктуре используются:

  • CRL (Certificate Revocation List)
  • OCSP (Online Certificate Status Protocol)

jsrsasign поддерживает работу с CRL, но не реализует полноценный OCSP-клиент.


Итоговая модель

  • Root CA — доверенный якорь
  • Intermediate CA — слой делегирования
  • End-Entity — конечная точка использования

Такая архитектура обеспечивает баланс между безопасностью и масштабируемостью, а jsrsasign даёт полный контроль над созданием и управлением этой иерархией на уровне JavaScript.