В CSR (Certificate Signing Request) в контексте Jsrsasign формируется
ASN.1-структура запроса на сертификат, соответствующая PKCS#10. Внутри
этой структуры ключевыми компонентами выступают subject,
publicKey и attributes. Эти поля определяют
идентичность владельца ключа, сам криптографический материал и
дополнительные расширения запроса.
Поле subject описывает субъект сертификата в формате
Distinguished Name (DN). Это структурированное имя, состоящее из набора
атрибутов, которые однозначно идентифицируют владельца ключевой
пары.
Типичная структура subject включает:
В Jsrsasign DN задаётся либо строкой, либо объектной формой.
Пример строкового представления:
subject = "/C=RU/ST=Moscow/L=Moscow/O=Example Corp/OU=IT/CN=example.com";
Объектная форма используется при более строгой генерации:
subject = {
C: "RU",
ST: "Moscow",
L: "Moscow",
O: "Example Corp",
OU: "IT",
CN: "example.com"
};
При формировании CSR библиотека преобразует subject в ASN.1 структуру
Name, которая затем встраивается в
CertificationRequestInfo.
Важная особенность заключается в том, что subject не
является просто текстовым идентификатором — он кодируется как
последовательность Relative Distinguished Names (RDN), где каждый
элемент представляет собой атрибут X.509.
Поле publicKey содержит открытый ключ, который будет
связан с будущим сертификатом. Этот ключ соответствует закрытому ключу,
который остаётся у владельца и используется для подписи данных.
В Jsrsasign publicKey может быть представлен в нескольких формах:
RSAKey,
KJUR.crypto.ECDSA)Пример использования RSA ключа:
const kp = KEYUTIL.generateKeypair("RSA", 2048);
const csr = new KJUR.asn1.csr.CertificationRequest({
subject: "/C=RU/O=Example/CN=example.com",
sbjpubkey: kp.pubKeyObj,
sigalg: "SHA256withRSA",
sbjprvkey: kp.prvKeyObj
});
Здесь sbjpubkey является фактическим контейнером для
publicKey.
На уровне ASN.1 структура выглядит как
SubjectPublicKeyInfo, включающая:
Ключевая роль publicKey в CSR заключается в том, что удостоверяющий центр (CA) позже будет использовать его для формирования X.509 сертификата, привязанного к данному ключу.
Важно, что publicKey не шифруется в CSR — он передаётся открыто, поскольку является публичной частью криптографической пары.
Поле attributes в CSR используется для передачи
дополнительных структур данных, которые не входят в subject или
publicKey. В PKCS#10 они представлены как набор атрибутов типа
Attribute.
Наиболее часто используемым атрибутом является:
extensionRequest (OID: 1.2.840.113549.1.9.14)Он позволяет запрашивать расширения X.509 сертификата, такие как:
Пример задания attributes в Jsrsasign:
attributes: [
{
extname: "subjectAltName",
array: [
{ dns: "example.com" },
{ dns: "www.example.com" },
{ email: "admin@example.com" }
]
}
]
Внутри CSR это преобразуется в ASN.1 структуру
Attribute, содержащую AttributeType и
AttributeValueSet.
Jsrsasign автоматически кодирует расширения в формате X.509
Extensions через ExtensionRequest.
Пример формирования SAN через attributes:
const csr = new KJUR.asn1.csr.CertificationRequest({
subject: "/C=RU/O=Example/CN=example.com",
sbjpubkey: kp.pubKeyObj,
sbjprvkey: kp.prvKeyObj,
sigalg: "SHA256withRSA",
extreq: [
{
extname: "subjectAltName",
array: [
{ dns: "example.com" },
{ dns: "api.example.com" }
]
}
]
});
Внутри структуры CSR это преобразуется в:
Attribute:
type = extensionRequest
value = SEQUENCE OF Extensions
На уровне ASN.1 CSR состоит из трёх ключевых блоков:
CertificationRequestInfo
signatureAlgorithm
signatureValue
Связь полей:
subject → идентификация владельцаpublicKey → криптографическая привязкаattributes → расширенные требования сертификатаSubject и attributes кодируются по разным ASN.1 правилам:
Name → RDNSequenceAttribute ::= SEQUENCE { type, values }При этом attributes могут содержать как простые OID-значения, так и сложные структуры (например, набор расширений сертификата).
Внутренняя логика Jsrsasign при сборке CSR:
subject как DER-кодированного NamepublicKey в SubjectPublicKeyInfoattributes (если заданы)CertificationRequestInfosignatureValueПри проверке CSR сервером CA происходит:
Если attributes содержат extensionRequest, CA может:
В отличие от subject и publicKey, attributes не являются обязательными для валидности CSR.
При работе с Jsrsasign часто встречаются ошибки:
/CN=)Совместно они формируют минимально достаточный набор данных для запроса сертификата в инфраструктуре X.509