KJUR.asn1.csr.CertificationRequest представляет собой реализацию структуры PKCS#10 Certification Request в библиотеке Jsrsasign. Данный класс используется для формирования CSR (Certificate Signing Request) — запроса на выпуск цифрового сертификата, который содержит публичный ключ, идентификационные данные субъекта и цифровую подпись, подтверждающую владение приватным ключом.
CSR является фундаментальным элементом инфраструктуры открытых ключей (PKI), поскольку именно он передается в удостоверяющий центр (CA) для получения X.509 сертификата.
Объект CertificationRequest соответствует ASN.1 структуре:
certificationRequest
certificationRequestInfo
signatureAlgorithm
signatureValue
В контексте Jsrsasign эти части формируются автоматически при использовании класса KJUR.asn1.csr.CertificationRequest.
KJUR.asn1.csr.CertificationRequest выполняет следующие задачи:
Основной результат работы класса — строка PEM:
-----BEGIN CERTIFICATE REQUEST-----
...
-----END CERTIFICATE REQUEST-----
Создание объекта CertificationRequest осуществляется через конфигурационный объект.
new KJUR.asn1.csr.CertificationRequest(param)
subject
sbjpubkey
sigalg
алгоритм подписи
например:
"SHA256withRSA""SHA384withECDSA"sbjprvkey
extreq
Subject описывает владельца сертификата. Формат DN поддерживается в виде структуры:
subject: {
str: "/C=US/O=Example/CN=example.com"
}
или через объект:
subject: {
C: "US",
O: "Example",
CN: "example.com"
}
Поддерживаемые атрибуты:
Публичный ключ передается через параметр sbjpubkey.
const rsa = KEYUTIL.generateKeypair("RSA", 2048);
const csr = new KJUR.asn1.csr.CertificationRequest({
subject: { CN: "example.com" },
sbjpubkey: rsa.pubKeyObj,
sbjprvkey: rsa.prvKeyObj,
sigalg: "SHA256withRSA"
});
const ec = KEYUTIL.generateKeypair("EC", "secp256r1");
const csr = new KJUR.asn1.csr.CertificationRequest({
subject: { CN: "example.com" },
sbjpubkey: ec.pubKeyObj,
sbjprvkey: ec.prvKeyObj,
sigalg: "SHA256withECDSA"
});
Поддерживаемые сигнатурные алгоритмы:
Выбор алгоритма влияет на безопасность и совместимость с удостоверяющими центрами.
Расширения добавляются через параметр extreq.
extreq: [
{
subjectAltName: {
array: [
{ type: 2, value: "example.com" },
{ type: 2, value: "www.example.com" },
{ type: 7, ip: "192.168.0.1" }
]
}
}
]
После создания объекта CSR можно получить PEM:
const pem = csr.getPEM();
Результат:
-----BEGIN CERTIFICATE REQUEST-----
MIIC...==
-----END CERTIFICATE REQUEST-----
Процесс генерации CSR включает несколько этапов:
Собираются:
Структура сериализуется в ASN.1 DER формат.
Хэшируется CertificationRequestInfo и подписывается приватным ключом.
Объединяются:
const prv = KEYUTIL.getKey(privateKeyPEM);
const pub = KEYUTIL.getKey(publicKeyPEM);
const csr = new KJUR.asn1.csr.CertificationRequest({
subject: {
C: "RU",
O: "My Company",
CN: "site.local"
},
sbjpubkey: pub,
sbjprvkey: prv,
sigalg: "SHA256withRSA"
});
CSR не будет валиден, если публичный и приватный ключ не образуют пару.
Некоторые CA не принимают SHA1 или слабые RSA ключи.
Некорректные поля subject могут привести к отклонению запроса:
const kp = KEYUTIL.generateKeypair("RSA", 2048);
const csr = new KJUR.asn1.csr.CertificationRequest({
subject: {
C: "RU",
ST: "Moscow",
L: "Moscow",
O: "Example Ltd",
CN: "example.com"
},
sbjpubkey: kp.pubKeyObj,
sbjprvkey: kp.prvKeyObj,
sigalg: "SHA256withRSA"
});
const pemCSR = csr.getPEM();
Сформированный CSR передается в CA для выпуска сертификата. После проверки:
CSR не содержит приватного ключа, что обеспечивает безопасность процесса.
Внутренне структура выглядит как:
CertificationRequest ::= SEQUENCE {
certificationRequestInfo CertificationRequestInfo,
signatureAlgorithm AlgorithmIdentifier,
signature BIT STRING
}
CertificationRequestInfo:
CertificationRequestInfo ::= SEQUENCE {
version INTEGER,
subject Name,
subjectPKInfo SubjectPublicKeyInfo,
attributes [0] IMPLICIT SET OF Attribute
}
Атрибуты позволяют расширять функциональность запроса:
Пример:
attributes: [
{
extreq: [...]
}
]