Расширения X.509 формируют дополнительный слой метаданных сертификата, который определяет ограничения использования ключа, контекст доверия и поведение в инфраструктуре PKI. В JavaScript-библиотеке Jsrsasign работа с этими расширениями строится вокруг разбора ASN.1-структуры сертификата и извлечения значений по OID, без необходимости вручную интерпретировать DER-деревья.
Каждое расширение сертификата представляет собой пару:
Расширения могут быть:
Внутри сертификата они находятся в секции extensions
структуры TBSCertificate.
В Jsrsasign сертификат обычно разбирается через объект:
var x509 = new X509();
x509.readCertPEM(pemString);
После загрузки сертификата становятся доступны методы для извлечения расширений. Библиотека не ограничивает пользователя фиксированным набором свойств — вместо этого используется доступ по OID.
Основной механизм получения данных расширений:
var val = x509.getExtInfo("2.5.29.15"); // keyUsage
Каждое расширение идентифицируется стандартным OID:
2.5.29.15 — Key Usage2.5.29.17 — Subject Alternative Name2.5.29.19 — Basic Constraints2.5.29.37 — Extended Key UsageВозвращаемое значение обычно уже декодировано в удобную структуру (строка, массив или объект), но зависит от типа расширения.
Расширение Basic Constraints определяет, может ли сертификат выступать центром сертификации.
OID:
2.5.29.19
В Jsrsasign:
var bc = x509.getExtInfo("2.5.29.19");
Типичная структура результата:
{
cA: true,
pathLen: 2
}
Ключевые поля:
cA — флаг CA-сертификатаpathLen — максимальная глубина цепочки
сертификацииЕсли cA = false, сертификат предназначен только для
конечных сущностей.
Расширение Key Usage задаёт допустимые криптографические операции.
OID:
2.5.29.15
Извлечение:
var ku = x509.getExtInfo("2.5.29.15");
Часто возвращается массив или строковый список:
Пример интерпретации:
if (ku.includes("digitalSignature")) {
// сертификат может использоваться для подписи данных
}
Это расширение критически важно для TLS и проверки цепочек доверия.
Extended Key Usage (EKU) уточняет сценарии применения сертификата.
OID:
2.5.29.37
Извлечение:
var eku = x509.getExtInfo("2.5.29.37");
Типовые значения:
Пример:
if (eku.includes("serverAuth")) {
// сертификат подходит для HTTPS сервера
}
EKU часто используется в сочетании с Key Usage, формируя строгие политики применения.
Одно из самых важных расширений в современных TLS-конфигурациях.
OID:
2.5.29.17
Извлечение:
var san = x509.getExtInfo("2.5.29.17");
Структура может включать:
Пример результата:
{
dns: ["example.com", "www.example.com"],
ip: ["192.168.0.1"]
}
В современных браузерах именно SAN определяет валидность домена, а не Common Name.
Эти расширения используются для построения цепочки доверия.
OID:
2.5.29.14
var ski = x509.getExtInfo("2.5.29.14");
Обычно возвращает хэш публичного ключа.
OID:
2.5.29.35
var aki = x509.getExtInfo("2.5.29.35");
Может содержать:
Эти поля позволяют сопоставить сертификат с его issuer в цепочке PKI.
Расширение Certificate Policies описывает правила использования сертификата.
OID:
2.5.29.32
Извлечение:
var policies = x509.getExtInfo("2.5.29.32");
Типичная структура:
[
{
policyOID: "2.23.140.1.2.1",
cps: "https://ca.example/policy"
}
]
Часто используется в EV/OV сертификатах и корпоративных PKI.
Определяет адреса списков отозванных сертификатов.
OID:
2.5.29.31
var crl = x509.getExtInfo("2.5.29.31");
Пример:
{
urls: [
"http://crl.example.com/root.crl"
]
}
Используется при проверке актуальности сертификата.
Jsrsasign работает поверх ASN.1-парсера KJUR.asn1. При
необходимости можно анализировать расширения на низком уровне:
var hex = x509.hex;
var asn1 = ASN1HEX.parse(hex);
Каждое расширение в DER-структуре кодируется как:
Extension ::= SEQUENCE {
extnID OBJECT IDENTIFIER,
critical BOOLEAN DEFAULT FALSE,
extnValue OCTET STRING
}
extnValue дополнительно содержит вложенную
ASN.1-структуру, которую библиотека декодирует автоматически.
Если OID не поддерживается явно, Jsrsasign обычно возвращает:
Пример:
var ext = x509.getExtInfo("1.2.3.4.5.6");
В этом случае требуется ручная интерпретация через ASN.1 декодирование.
Некоторые методы позволяют определить, является ли расширение критическим:
var ext = x509.getExtInfo("2.5.29.19");
var isCritical = x509.getExtCritical("2.5.29.19");
Критичность влияет на поведение клиента: неизвестное критическое расширение должно приводить к отклонению сертификата.
var eku = x509.getExtInfo("2.5.29.37");
var san = x509.getExtInfo("2.5.29.17");
if (!eku.includes("serverAuth")) {
throw new Error("Not a server certificate");
}
if (!san.dns.includes("example.com")) {
throw new Error("Domain mismatch");
}
var bc = x509.getExtInfo("2.5.29.19");
if (!bc.cA) {
throw new Error("Not a CA certificate");
}
Архитектура Jsrsasign позволяет добавлять поддержку новых расширений без изменения ядра библиотеки. Новые OID могут быть обработаны через пользовательские функции декодирования ASN.1, что особенно важно для частных PKI и корпоративных стандартов.