Идентификаторы объектов (OID) в структуре X.509 определяют стандартизированные или частные расширения сертификатов, а также алгоритмы, атрибуты и политики. В контексте криптографических библиотек JavaScript, таких как Jsrsasign, работа с OID является фундаментальной частью формирования и анализа сертификатов X.509, особенно при обработке расширений.
OID (Object Identifier) представляет собой иерархическую
последовательность чисел, разделённых точками, например
2.5.29.14. Такая запись однозначно идентифицирует
конкретный элемент в глобальном дереве стандартов ASN.1. В сертификатах
X.509 расширения определяются именно через OID, что позволяет
интерпретировать дополнительные поля, не входящие в базовую структуру
сертификата.
Расширения сертификатов X.509 могут быть как стандартными, так и пользовательскими. Стандартные расширения определены RFC 5280 и включают такие элементы, как:
2.5.29.14)2.5.29.35)2.5.29.15)2.5.29.37)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 следующим образом:
Jsrsasign автоматически выполняет эти преобразования при использовании высокоуровневых классов.
Представление OID в Jsrsasign
В библиотеке Jsrsasign OID может задаваться в нескольких формах:
"2.5.29.19"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
});
OID: 2.5.29.15
Определяет допустимые криптографические операции: подпись, шифрование, обмен ключами.
new KJUR.asn1.x509.KeyUsage({
digitalSignature: true,
keyEncipherment: true
});
OID: 2.5.29.37
Уточняет сценарии использования ключа, например TLS сервер или клиент.
new KJUR.asn1.x509.ExtKeyUsage({
serverAuth: true,
clientAuth: true
});
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 в 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 не пытается его интерпретировать. Вместо этого:
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 остаётся центральным элементом идентификации всех криптографических расширений, обеспечивая совместимость и масштабируемость инфраструктуры PKI.