Структура сертификата X.509 v3

Стандарт X.509 v3 определяет формат цифрового сертификата, используемого в инфраструктуре открытых ключей (PKI). Третья версия расширяет предыдущие спецификации за счёт механизма расширений (extensions), что делает её гибкой для современных криптографических систем.

Ключевое поле версии определяет структуру сертификата:

  • v1 — базовая версия без расширений
  • v2 — добавлены уникальные идентификаторы субъекта и издателя
  • v3 — введены расширения, определяющие дополнительные свойства сертификата

В JavaScript-библиотеке jsrsasign работа с сертификатами X.509 v3 осуществляется через объект X509, предоставляющий методы парсинга и извлечения данных из DER/PEM представлений.


Основная структура X.509 сертификата

Сертификат X.509 v3 представляет собой ASN.1 структуру, закодированную в DER. Его логическая структура включает несколько обязательных блоков:

  • TBSCertificate (To Be Signed Certificate)
  • AlgorithmIdentifier (алгоритм подписи)
  • SignatureValue (подпись сертификата)

TBSCertificate

Основной контейнер данных, которые подписываются издателем сертификата.

Содержит:

  • версия (version)
  • серийный номер (serialNumber)
  • алгоритм подписи (signature)
  • издатель (issuer)
  • срок действия (validity)
  • субъект (subject)
  • публичный ключ субъекта (subjectPublicKeyInfo)
  • расширения (extensions, только v3)

Версия сертификата (Version)

Поле версии указывает на используемую спецификацию X.509.

В ASN.1 оно представлено как:

version  [0]  EXPLICIT Version DEFAULT v1

В jsrsasign извлечение версии осуществляется через объект:

var x = new X509();
x.readCertPEM(pemString);
console.log(x.version);

Значение:

  • 2 соответствует X.509 v3 (нумерация с нуля в ASN.1)

Серийный номер (Serial Number)

Серийный номер — уникальный идентификатор сертификата, присваиваемый удостоверяющим центром (CA).

Характеристики:

  • должен быть уникален в рамках CA
  • используется для отзыва сертификатов (CRL)
  • имеет произвольную длину

В jsrsasign:

x.getSerialNumberHex();

Результат возвращается в шестнадцатеричном виде.


Алгоритм подписи (Signature Algorithm)

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

Примеры:

  • sha256WithRSAEncryption
  • ecdsa-with-SHA256
  • sha384WithRSAEncryption

Структура:

AlgorithmIdentifier ::= SEQUENCE {
    algorithm OBJECT IDENTIFIER,
    parameters ANY DEFINED BY algorithm OPTIONAL
}

В jsrsasign:

x.getSignatureAlgorithmField();

Издатель (Issuer)

Поле issuer содержит DN (Distinguished Name) удостоверяющего центра, подписавшего сертификат.

Типичная структура:

  • CN — Common Name
  • O — Organization
  • OU — Organizational Unit
  • C — Country
  • L — Locality

Пример:

CN=Example CA, O=Example Org, C=US

В jsrsasign:

x.getIssuerString();

Срок действия (Validity)

Поле validity определяет интервал действия сертификата.

Состоит из двух элементов:

  • notBefore — начало действия
  • notAfter — окончание действия

Формат времени:

  • UTCTime (до 2050 года)
  • GeneralizedTime (после 2050 года)

Пример структуры:

Validity ::= SEQUENCE {
    notBefore Time,
    notAfter Time
}

В jsrsasign:

x.getNotBefore();
x.getNotAfter();

Субъект (Subject)

Поле subject определяет владельца сертификата.

Структура аналогична issuer:

  • CN — имя субъекта
  • O — организация
  • OU — подразделение

Пример:

CN=api.example.com, O=Example Corp, C=US

В jsrsasign:

x.getSubjectString();

Subject Public Key Info

Один из ключевых элементов сертификата, содержащий открытый ключ субъекта.

Структура:

SubjectPublicKeyInfo ::= SEQUENCE {
    algorithm AlgorithmIdentifier,
    subjectPublicKey BIT STRING
}

Поддерживаемые алгоритмы:

  • RSA
  • ECDSA
  • Ed25519 (в современных расширениях)

В jsrsasign:

x.getPublicKey();

Возвращает объект ключа для дальнейшей криптографической работы.


Расширения X.509 v3

Расширения являются ключевым отличием версии v3 от предыдущих.

Каждое расширение имеет:

  • OID (Object Identifier)
  • критичность (critical)
  • значение (value)

Основные типы расширений

Basic Constraints

Определяет, является ли сертификат CA.

  • CA: true/false
  • pathLenConstraint: ограничение длины цепочки

Key Usage

Определяет назначение ключа:

  • digitalSignature
  • keyEncipherment
  • keyCertSign
  • cRLSign

Extended Key Usage

Расширенное назначение:

  • serverAuth
  • clientAuth
  • codeSigning
  • emailProtection

Subject Alternative Name (SAN)

Позволяет указывать дополнительные имена:

  • DNS
  • IP адреса
  • email

Authority Key Identifier

Используется для построения цепочки доверия.


Работа с расширениями в jsrsasign

Библиотека предоставляет доступ к расширениям через методы объекта X509.

Пример:

x.getExtBasicConstraints();
x.getExtKeyUsageString();
x.getExtSubjectAltName();

Для более низкоуровневого доступа:

x.getExtInfo();

ASN.1 представление структуры

Полная структура TBSCertificate:

TBSCertificate ::= SEQUENCE {
    version          [0]  Version DEFAULT v1,
    serialNumber          CertificateSerialNumber,
    signature             AlgorithmIdentifier,
    issuer                Name,
    validity              Validity,
    subject               Name,
    subjectPublicKeyInfo  SubjectPublicKeyInfo,
    extensions      [3]   Extensions OPTIONAL
}

Кодирование DER и PEM

Сертификаты X.509 могут быть представлены в двух форматах:

DER

  • бинарное кодирование ASN.1
  • используется в системах и протоколах напрямую

PEM

  • Base64 поверх DER
  • обрамляется заголовками:
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

В jsrsasign:

x.readCertPEM(pemString);

Цепочка сертификатов

X.509 v3 поддерживает построение цепочек доверия:

  • конечный сертификат (end-entity)
  • промежуточные CA
  • корневой CA

Проверка цепочки основана на:

  • совпадении issuer и subject
  • проверке подписи
  • проверке сроков действия
  • проверке расширений

Подпись сертификата

Подпись формируется на основе TBSCertificate и закрытого ключа CA.

Процесс:

  1. Формирование TBSCertificate
  2. Хеширование (SHA-256, SHA-384 и др.)
  3. Подпись приватным ключом CA
  4. Запись SignatureValue

В jsrsasign проверка:

x.verifySignatureWithCert(certCA);

Роль X.509 v3 в PKI

Структура сертификата используется в:

  • TLS/SSL соединениях
  • VPN системах
  • цифровых подписях
  • аутентификации пользователей
  • подписании кода

Расширения v3 позволяют адаптировать сертификаты под различные сценарии безопасности без изменения базового стандарта.