В структуре X.509 расширения (extensions) определяют дополнительные атрибуты сертификата, выходящие за рамки базовых полей субъекта и ключа. В контексте Jsrsasign работа с расширениями выполняется на этапе построения сертификата и влияет на итоговую ASN.1-структуру, включаемую в подпись.
Расширения кодируются в поле extensions объекта
сертификата и формируются через специализированные ASN.1-конструкторы
библиотеки KJUR.asn1.x509.
Расширения представляют собой массив объектов, где каждый элемент описывает отдельное расширение:
extname или
ext)critical)value или ASN.1 структура)Общий принцип построения:
ext: [
{
extname: "keyUsage",
critical: true,
names: ["digitalSignature", "keyEncipherment"]
}
]
Каждое расширение преобразуется в DER-представление внутри сертификата.
При создании сертификата через
KJUR.asn1.x509.Certificate расширения передаются в
параметре конфигурации:
const cert = new KJUR.asn1.x509.Certificate({
version: 3,
serial: { hex: "01" },
sigalg: "SHA256withRSA",
issuer: { str: "/C=US/O=Example CA" },
notbefore: "230101000000Z",
notafter: "240101000000Z",
subject: { str: "/C=US/O=Example" },
sbjpubkey: pubKeyObj,
ext: [
{
extname: "basicConstraints",
cA: false
}
]
});
Внутри процесса построения сертификата Jsrsasign вызывает генераторы ASN.1 для каждого расширения и формирует структуру:
Расширение basicConstraints определяет, является ли
сертификат удостоверяющим центром.
ext: [
{
extname: "basicConstraints",
cA: true,
pathLen: 2
}
]
Особенности:
cA: true — сертификат CApathLen ограничивает глубину цепочкиASN.1 структура формируется через
KJUR.asn1.x509.BasicConstraints.
Расширение определяет допустимые операции с ключом.
ext: [
{
extname: "keyUsage",
critical: true,
names: [
"digitalSignature",
"keyEncipherment",
"keyCertSign"
]
}
]
Поддерживаемые значения:
Каждое значение кодируется в битовую маску ASN.1 BIT STRING.
Используется для уточнения сценариев применения ключа.
ext: [
{
extname: "extKeyUsage",
array: [
"serverAuth",
"clientAuth"
]
}
]
Примеры значений:
Расширение SAN позволяет привязать дополнительные идентификаторы к сертификату.
ext: [
{
extname: "subjectAltName",
array: [
{ dns: "example.com" },
{ dns: "api.example.com" },
{ ip: "192.168.1.10" }
]
}
]
Поддерживаются типы:
В ASN.1 формируется структура GeneralNames.
Используются для построения цепочек доверия.
ext: [
{
extname: "subjectKeyIdentifier"
},
{
extname: "authorityKeyIdentifier",
keyid: "auto"
}
]
Особенности:
subjectKeyIdentifier генерируется из публичного
ключаauthorityKeyIdentifier связывает сертификат с
издателемJsrsasign позволяет добавлять произвольные расширения через OID.
ext: [
{
ext: "1.2.3.4.5.6",
critical: false,
value: {
hex: "0c0a48656c6c6f576f726c64"
}
}
]
Используется:
Каждое расширение преобразуется в структуру:
Extension ::= SEQUENCE {
extnID OBJECT IDENTIFIER,
critical BOOLEAN DEFAULT FALSE,
extnValue OCTET STRING
}
Jsrsasign выполняет двойное кодирование:
Это критично для совместимости с OpenSSL и браузерными валидаторами.
Поле critical влияет на поведение валидаторов
сертификата:
true — обязательная поддержка расширенияfalse — может игнорироватьсяПример:
ext: [
{
extname: "keyUsage",
critical: true,
names: ["digitalSignature"]
}
]
Если критическое расширение не поддерживается клиентом, сертификат считается недействительным.
Некоторые расширения логически связаны:
basicConstraints определяет роль CAkeyUsage должен включать keyCertSign для
CAsubjectAltName заменяет использование CN в современных
TLSНесоответствие приводит к ошибкам в цепочке доверия при проверке через OpenSSL или браузеры.
const cert = new KJUR.asn1.x509.Certificate({
version: 3,
serial: { int: 1000 },
sigalg: "SHA256withRSA",
issuer: { str: "/C=US/O=Root CA" },
subject: { str: "/C=US/O=Service" },
sbjpubkey: pubKeyObj,
notbefore: "250101000000Z",
notafter: "260101000000Z",
ext: [
{
extname: "basicConstraints",
cA: false
},
{
extname: "keyUsage",
critical: true,
names: ["digitalSignature", "keyEncipherment"]
},
{
extname: "subjectAltName",
array: [
{ dns: "service.local" }
]
}
]
});
При построении сертификата выполняется последовательность:
KJUR.asn1.x509.*Extensions SEQUENCEОшибки на уровне расширений приводят к сбоям на этапе DER-кодирования до формирования подписи.
Особенно критично: