Запрос на сертификат в формате PKCS#10 представляет собой
ASN.1-структуру, содержащую сведения о субъекте, его открытый ключ и
цифровую подпись, подтверждающую владение соответствующим приватным
ключом. В контексте JavaScript и библиотеки jsrsasign этот процесс
сводится к формированию объекта CertificationRequest, его
кодированию в DER и последующему преобразованию в PEM.
CSR включает несколько ключевых компонентов:
Внутреннее представление 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
}
Именно эта структура подписывается приватным ключом.
В jsrsasign генерация или загрузка ключа выполняется через
KEYUTIL.
const kp = KEYUTIL.generateKeypair("RSA", 2048);
const privateKey = kp.prvKeyObj;
const publicKey = kp.pubKeyObj;
const privateKey = KEYUTIL.getKey(pemPrivateKey);
DN описывает владельца сертификата и включает стандартные атрибуты:
Формат в jsrsasign:
const subject = [
{ C: "KZ" },
{ ST: "Karaganda Region" },
{ L: "Karaganda" },
{ O: "Example Org" },
{ OU: "IT Department" },
{ CN: "example.com" }
];
Основной класс для работы с PKCS#10 —
KJUR.asn1.csr.CertificationRequest.
const csr = new KJUR.asn1.csr.CertificationRequest({
subject: {
str: "/C=KZ/ST=Karaganda/L=Karaganda/O=Example Org/OU=IT/CN=example.com"
},
sbjpubkey: publicKey,
sigalg: "SHA256withRSA",
sbjprvkey: privateKey
});
const pem = csr.getPEM();
Subject Alternative Name используется для указания дополнительных доменных имён.
В jsrsasign расширения задаются через ASN.1-конструкторы.
const ext = [
{
extname: "subjectAltName",
array: [
{ dns: "example.com" },
{ dns: "www.example.com" },
{ dns: "api.example.com" }
]
}
];
Подключение расширений:
const csr = new KJUR.asn1.csr.CertificationRequest({
subject: {
str: "/CN=example.com/O=Example Org/C=KZ"
},
sbjpubkey: publicKey,
sbjprvkey: privateKey,
sigalg: "SHA256withRSA",
extreq: ext
});
Поддерживаются алгоритмы на эллиптических кривых.
const kp = KEYUTIL.generateKeypair("EC", "secp256r1");
const csr = new KJUR.asn1.csr.CertificationRequest({
subject: {
str: "/CN=example.com/O=Example Org/C=KZ"
},
sbjpubkey: kp.pubKeyObj,
sbjprvkey: kp.prvKeyObj,
sigalg: "SHA256withECDSA"
});
const pem = csr.getPEM();
CSR обычно представляется в двух формах:
Base64-обёртка:
-----BEGIN CERTIFICATE REQUEST-----
MIIC...
-----END CERTIFICATE REQUEST-----
Бинарный формат, используемый внутри TLS и криптографических библиотек.
В jsrsasign:
const der = csr.getEncodedHex();
Проверка корректности включает:
const result = KJUR.asn1.csr.CSRUtil.verifyCSR(pem);
Возвращаемое значение true означает корректную
подпись.
Извлечение данных из CSR:
const info = KJUR.asn1.csr.CSRUtil.getInfo(pem);
Структура результата:
PKCS#10 позволяет включать произвольные атрибуты, например challengePassword или extensionRequest.
Пример:
const csr = new KJUR.asn1.csr.CertificationRequest({
subject: {
str: "/CN=example.com"
},
sbjpubkey: publicKey,
sbjprvkey: privateKey,
sigalg: "SHA256withRSA",
attrs: [
{
extname: "challengePassword",
value: "secret"
}
]
});
Некорректное использование jsrsasign обычно связано с несколькими проблемами:
sigalg)Типичный поток обработки:
const kp = KEYUTIL.generateKeypair("RSA", 2048);
const csr = new KJUR.asn1.csr.CertificationRequest({
subject: {
str: "/C=KZ/O=Example/CN=example.com"
},
sbjpubkey: kp.pubKeyObj,
sbjprvkey: kp.prvKeyObj,
sigalg: "SHA256withRSA",
extreq: [
{
extname: "subjectAltName",
array: [{ dns: "example.com" }]
}
]
});
const csrPEM = csr.getPEM();
Подпись CSR формируется по следующему принципу:
CertificationRequestInfoДля RSA используется схема PKCS#1 v1.5 или PSS (в зависимости от конфигурации).
CSR, созданный через jsrsasign, полностью совместим с:
Сгенерированный PEM можно проверить:
openssl req -in request.pem -text -noout
Это помогает сопоставить структуру jsrsasign с реальной ASN.1 моделью.