OID расширений сертификата

Идентификаторы объектов (OID) в структуре X.509 определяют стандартизированные или частные расширения сертификатов, а также алгоритмы, атрибуты и политики. В контексте криптографических библиотек JavaScript, таких как Jsrsasign, работа с OID является фундаментальной частью формирования и анализа сертификатов X.509, особенно при обработке расширений.

OID (Object Identifier) представляет собой иерархическую последовательность чисел, разделённых точками, например 2.5.29.14. Такая запись однозначно идентифицирует конкретный элемент в глобальном дереве стандартов ASN.1. В сертификатах X.509 расширения определяются именно через OID, что позволяет интерпретировать дополнительные поля, не входящие в базовую структуру сертификата.

Расширения сертификатов X.509 могут быть как стандартными, так и пользовательскими. Стандартные расширения определены RFC 5280 и включают такие элементы, как:

  • Subject Key Identifier (2.5.29.14)
  • Authority Key Identifier (2.5.29.35)
  • Key Usage (2.5.29.15)
  • Extended Key Usage (2.5.29.37)
  • Basic Constraints (2.5.29.19)

Каждое расширение имеет строгую ASN.1 структуру и кодируется в DER-формате. Jsrsasign предоставляет инструменты для создания, кодирования и декодирования таких структур через пространство имён KJUR.asn1.x509.

Работа с OID в Jsrsasign

В Jsrsasign OID используется как строковый идентификатор при построении ASN.1 объектов. Библиотека включает встроенные определения для стандартных OID, однако разработчик может задавать и собственные значения.

Основной класс для работы с расширениями сертификата — KJUR.asn1.x509.Extension и связанные с ним структуры. OID передаётся как параметр extnID.

Пример создания расширения Key Usage:

const { KJUR } = require("jsrsasign");

const keyUsage = new KJUR.asn1.x509.KeyUsage({
  bin: "101"
});

const ext = new KJUR.asn1.x509.Extension({
  extnID: "2.5.29.15",
  critical: true,
  extnValue: keyUsage
});

В этом примере OID 2.5.29.15 указывает на расширение Key Usage. Значение critical определяет, является ли расширение обязательным для проверки при валидации сертификата.

Структура расширений сертификата

Каждое расширение X.509 в Jsrsasign представляется как ASN.1 структура:

Extension ::= SEQUENCE {
  extnID      OBJECT IDENTIFIER,
  critical    BOOLEAN DEFAULT FALSE,
  extnValue   OCTET STRING
}

OID выступает ключевым элементом, определяющим тип содержимого extnValue. Именно на основании OID клиент или сервер понимает, как интерпретировать бинарные данные внутри расширения.

Расширения кодируются в DER следующим образом:

  • OID преобразуется в ASN.1 OBJECT IDENTIFIER
  • значение расширения упаковывается в OCTET STRING
  • вся структура оборачивается в SEQUENCE

Jsrsasign автоматически выполняет эти преобразования при использовании высокоуровневых классов.

Представление OID в Jsrsasign

В библиотеке Jsrsasign OID может задаваться в нескольких формах:

  • строка "2.5.29.19"
  • объект из реестра OID (например KJUR.asn1.x509.OID)
  • иногда символьное имя (если поддерживается)

Пример использования символьного OID:

const ext = new KJUR.asn1.x509.Extension({
  extnID: "basicConstraints",
  critical: true,
  extnValue: new KJUR.asn1.x509.BasicConstraints({
    cA: true,
    pathLen: 2
  })
});

Внутренне Jsrsasign преобразует basicConstraints в 2.5.29.19.

Стандартные OID расширений

Ниже приведены ключевые расширения и их идентификаторы:

OID: 2.5.29.19

Определяет, является ли сертификат центром сертификации (CA) и допустимую глубину цепочки доверия.

new KJUR.asn1.x509.BasicConstraints({
  cA: true,
  pathLen: 3
});

Key Usage

OID: 2.5.29.15

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

new KJUR.asn1.x509.KeyUsage({
  digitalSignature: true,
  keyEncipherment: true
});

Extended Key Usage

OID: 2.5.29.37

Уточняет сценарии использования ключа, например TLS сервер или клиент.

new KJUR.asn1.x509.ExtKeyUsage({
  serverAuth: true,
  clientAuth: true
});

Subject Alternative Name

OID: 2.5.29.17

Содержит альтернативные имена субъекта: DNS, IP, email.

new KJUR.asn1.x509.SubjectAltName({
  array: [
    { dns: "example.com" },
    { ip: "192.168.1.1" }
  ]
});

Обработка пользовательских OID

Помимо стандартных значений, Jsrsasign позволяет использовать произвольные OID для частных расширений. Это особенно важно в корпоративных PKI или специализированных протоколах.

Пример пользовательского расширения:

const customExt = new KJUR.asn1.x509.Extension({
  extnID: "1.2.3.4.5.6.7.8.1",
  critical: false,
  extnValue: {
    toHexString: function() {
      return "3010a00e0c0c637573746f6d2076616c7565";
    }
  }
});

Здесь extnValue должен быть закодирован в DER-формате и представлен как HEX-строка.

Работа с OID в процессе валидации сертификата

При проверке сертификата Jsrsasign анализирует список расширений и сопоставляет OID с известными обработчиками. Если OID неизвестен, расширение сохраняется как “opaque” структура.

Пример извлечения расширений:

const x509 = new KJUR.asn1.x509.X509();
x509.readCertPEM(pemCert);

const extList = x509.getExtInfo();

Результатом является список объектов, где каждый элемент содержит:

  • OID
  • critical flag
  • raw DER value
  • интерпретированное значение (если поддерживается)

Кодирование OID в ASN.1

OID в ASN.1 кодируется согласно правилам BER/DER. Первые два числа кодируются особым образом:

OID: 2.5.29.15

Преобразуется в:

2*40 + 5 = 85
29 15

Jsrsasign скрывает эту логику внутри ASN1ObjectIdentifier класса:

const oid = new KJUR.asn1.ASN1ObjectIdentifier({
  oid: "2.5.29.15"
});

Использование OID в генерации сертификатов

При создании сертификата через KJUR.asn1.x509.Certificate расширения добавляются через массив ext.

const cert = new KJUR.asn1.x509.Certificate({
  version: 3,
  serial: { int: 1 },
  sigalg: "SHA256withRSA",
  issuer: issuer,
  notbefore: "230101000000Z",
  notafter: "250101000000Z",
  subject: subject,
  sbjpubkey: pubkey,
  ext: [
    new KJUR.asn1.x509.Extension({
      extnID: "2.5.29.19",
      critical: true,
      extnValue: new KJUR.asn1.x509.BasicConstraints({
        cA: true
      })
    })
  ]
});

OID здесь определяет тип каждого расширения и влияет на совместимость сертификата с TLS-серверами и клиентами.

Роль OID в интероперабельности

OID обеспечивает совместимость между различными реализациями PKI. Независимо от языка программирования или платформы, интерпретация сертификата зависит именно от OID, а не от текстового описания.

Jsrsasign следует RFC-совместимой модели, что позволяет использовать сгенерированные сертификаты в браузерах, Node.js, Java-системах и аппаратных HSM-модулях.

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

Если сертификат содержит нестандартное расширение, Jsrsasign не пытается его интерпретировать. Вместо этого:

  • сохраняется OID как строка
  • значение остаётся в DER/HEX виде
  • разработчик может обработать его вручную
const unknown = {
  oid: "1.2.3.4.999",
  valueHex: "3014060..."
};

Такая модель гарантирует устойчивость при работе с расширенными PKI-системами.

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

Некоторые OID используются для определения политик сертификатов (Certificate Policies):

OID: 2.5.29.32

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

new KJUR.asn1.x509.CertificatePolicies({
  policies: [
    { policyoid: "2.23.140.1.2.1" }
  ]
});

Каждый policy OID может ссылаться на конкретные требования к валидации, например EV TLS сертификаты.

OID как основа расширяемости X.509

Архитектура X.509 построена таким образом, что любые новые возможности добавляются через OID без изменения базового стандарта. Jsrsasign полностью следует этой модели, позволяя:

  • добавлять новые расширения без модификации ядра библиотеки
  • интерпретировать стандартные OID автоматически
  • обрабатывать неизвестные расширения на уровне приложения

OID остаётся центральным элементом идентификации всех криптографических расширений, обеспечивая совместимость и масштабируемость инфраструктуры PKI.