CSR (Certificate Signing Request) — это структурированный запрос на
выпуск сертификата, который содержит информацию о субъекте, открытый
ключ и дополнительные атрибуты. В контексте криптографии на JavaScript
библиотека Jsrsasign предоставляет низкоуровневые инструменты для
формирования CSR через модуль KJUR.asn1.csr, позволяя
собирать PKCS
CSR формируется по стандарту PKCS#10 и включает несколько ключевых компонентов:
В Jsrsasign эти элементы собираются в объекте
KJUR.asn1.csr.CSRUtil, а также через низкоуровневые ASN.1
структуры.
Перед созданием CSR требуется RSA или EC ключевая пара. В Jsrsasign генерация может выполняться так:
const kp = KEYUTIL.generateKeypair("RSA", 2048);
const privateKey = kp.prvKeyObj;
const publicKey = kp.pubKeyObj;
Ключевой момент: CSR всегда подписывается приватным ключом, а публичный включается в структуру запроса.
DN описывает владельца сертификата в формате X.500:
В Jsrsasign DN задаётся строкой:
const subject = "/C=KZ/O=Example Org/OU=IT Department/CN=example.com";
Важно соблюдать порядок и формат слэшей.
Основной инструмент для создания CSR — CSRUtil. Он
позволяет собирать запрос на более высоком уровне:
const csrPem = KJUR.asn1.csr.CSRUtil.newCSRPEM({
subject: {
str: "/C=KZ/O=Example Org/OU=IT/CN=example.com"
},
sbjpubkey: publicKey,
sigalg: "SHA256withRSA",
sbjprvkey: privateKey
});
subject — DN в строковом форматеsbjpubkey — публичный ключ объекта Jsrsasignsbjprvkey — приватный ключ для подписи CSRsigalg — алгоритм подписи (например,
SHA256withRSA)Результатом является PEM-строка CSR:
-----BEGIN CERTIFICATE REQUEST-----
...
-----END CERTIFICATE REQUEST-----
Для более гибкого контроля используется ручная сборка ASN.1 структуры.
CSR состоит из:
CertificationRequest ::= SEQUENCE {
certificationRequestInfo CertificationRequestInfo,
signatureAlgorithm AlgorithmIdentifier,
signature BIT STRING
}
const csrInfo = new KJUR.asn1.csr.CertificationRequestInfo({
subject: { str: "/C=KZ/O=Example/CN=example.com" },
subjectPublicKey: publicKey
});
const algId = new KJUR.asn1.x509.AlgorithmIdentifier({
name: "SHA256withRSA"
});
const csr = new KJUR.asn1.csr.CertificationRequest({
certificationRequestInfo: csrInfo,
signatureAlgorithm: algId,
signature: privateKey.sign(csrInfo.getEncodedHex(), "sha256")
});
const pem = csr.getPEMString();
Этот подход используется, когда требуется:
Одним из наиболее важных расширений является SAN (Subject Alternative Name), позволяющий указывать дополнительные домены.
В Jsrsasign это делается через атрибуты CSR:
const san = {
extname: "subjectAltName",
array: [
{ dns: "example.com" },
{ dns: "www.example.com" },
{ ip: "192.168.0.1" }
]
};
const csrPem = KJUR.asn1.csr.CSRUtil.newCSRPEM({
subject: {
str: "/C=KZ/O=Example/CN=example.com"
},
sbjpubkey: publicKey,
sbjprvkey: privateKey,
extreq: [san],
sigalg: "SHA256withRSA"
});
SAN расширения критичны для TLS-сертификатов современных веб-систем.
Jsrsasign автоматически кодирует CSR в DER, затем в Base64 и оборачивает в PEM-структуру.
Если требуется получить DER:
const csr = KJUR.asn1.csr.CSRUtil.newCSR({
subject: { str: "/C=KZ/CN=example.com" },
sbjpubkey: publicKey,
sbjprvkey: privateKey
});
const derHex = csr.getEncodedHex();
DER используется в низкоуровневых протоколах и при интеграции с аппаратными HSM.
Jsrsasign позволяет разобрать CSR и проверить его корректность:
const parsed = KJUR.asn1.csr.CSRUtil.getInfo(csrPem);
console.log(parsed.subject);
console.log(parsed.sbjpubkey);
Также возможно верифицировать подпись:
const isValid = KJUR.asn1.csr.CSRUtil.verify(csrPem);
Поддерживаются основные алгоритмы:
SHA1withRSA (устаревший)SHA256withRSASHA384withRSASHA512withRSAПример:
sigalg: "SHA384withRSA"
Выбор алгоритма напрямую влияет на совместимость с удостоверяющими центрами.
CSR может быть создан не только на RSA, но и на эллиптических кривых:
const kp = KEYUTIL.generateKeypair("EC", "secp256r1");
const csrPem = KJUR.asn1.csr.CSRUtil.newCSRPEM({
subject: { str: "/CN=example.com" },
sbjpubkey: kp.pubKeyObj,
sbjprvkey: kp.prvKeyObj,
sigalg: "SHA256withECDSA"
});
EC CSR обычно меньше по размеру и быстрее в вычислениях.
Одна из критических ошибок — использование разных ключевых пар:
Это делает CSR недействительным.
Jsrsasign требует строгий формат /C=.../O=.../CN=....
Пробелы и отсутствие слэшей приводят к ошибкам.
ECDSA ключи нельзя подписывать RSA алгоритмами и наоборот.
Сформированный CSR обычно отправляется в:
Jsrsasign позволяет подготовить CSR полностью на клиентской стороне без серверной криптографии, что особенно важно для браузерных приложений и Node.js сервисов с ограниченными правами доступа к ключам.