KJUR.asn1.csr: классы и методы

Класс KJUR.asn1.csr.CSR представляет собой высокоуровневую реализацию формирования и обработки PKCS#10 Certificate Signing Request (CSR) в библиотеке Jsrsasign. Он инкапсулирует структуру запроса на сертификат, включая данные субъекта, открытый ключ и подпись.

Основная задача класса заключается в создании корректной ASN.1 структуры CSR и её последующей сериализации в форматы DER и PEM.

Основные свойства

  • subject — DN (Distinguished Name) субъекта сертификата
  • subjectPublicKey — открытый ключ субъекта
  • attributes — дополнительные атрибуты CSR (опционально)
  • signatureAlg — алгоритм подписи (например, SHA256withRSA)
  • sigHex — подпись CSR в hex-формате

Ключевые методы

setSubject(x509Name) Устанавливает имя субъекта CSR.

csr.setSubject("/C=RU/O=Example/CN=test.example.com");

setPublicKey(pubKey) Назначает открытый ключ, который будет включён в запрос.

csr.setPublicKey(rsaKey);

sign(privateKey, hashAlg) Формирует подпись CSR с использованием приватного ключа.

csr.sign(privateKey, "SHA256withRSA");

Подпись вычисляется над DER-представлением CertificationRequestInfo.

getPEM() Возвращает CSR в формате PEM.

const pem = csr.getPEM();

getHex() Возвращает DER-представление CSR в hex-формате.

const hex = csr.getHex();

verifySignature() Проверяет корректность подписи CSR с использованием публичного ключа.


KJUR.asn1.csr.CSRUtil

KJUR.asn1.csr.CSRUtil представляет собой вспомогательный утилитарный класс, упрощающий работу с CSR. Он используется для генерации, парсинга и анализа запросов на сертификаты без необходимости ручного управления ASN.1 структурой.

Методы CSRUtil

newCSRPEM(param) Создаёт CSR и возвращает его в PEM формате.

const csrPem = KJUR.asn1.csr.CSRUtil.newCSRPEM({
  subject: { str: "/C=RU/O=Org/CN=site.com" },
  sbjpubkey: rsaPublicKey,
  sigalg: "SHA256withRSA",
  sbjprvkey: rsaPrivateKey
});

Параметры объекта:

  • subject — строка или объект X.500 имени
  • sbjpubkey — публичный ключ субъекта
  • sbjprvkey — приватный ключ для подписи
  • sigalg — алгоритм подписи

getInfo(pemCSR) Извлекает структурированную информацию из CSR.

const info = KJUR.asn1.csr.CSRUtil.getInfo(csrPem);

Результат включает:

  • Subject DN
  • Public Key Info
  • Signature Algorithm
  • Attributes (если присутствуют)

verifySignature(pemCSR, pubKey) Проверяет подпись CSR.

const isValid = KJUR.asn1.csr.CSRUtil.verifySignature(csrPem, publicKey);

Внутренняя структура CSR в Jsrsasign

CSR в Jsrsasign соответствует стандарту PKCS#10 и состоит из трёх основных компонентов:

  1. CertificationRequestInfo

    • версия
    • subject
    • subjectPublicKeyInfo
    • attributes
  2. AlgorithmIdentifier

    • идентификатор алгоритма подписи
  3. signature

    • битовая строка подписи

Внутренне библиотека использует ASN.1 конструкторы из пространства KJUR.asn1, такие как:

  • KJUR.asn1.DERSequence
  • KJUR.asn1.DERInteger
  • KJUR.asn1.DERBitString
  • KJUR.asn1.x509.X500Name

Создание CSR через объект CSR

Низкоуровневое создание CSR требует явного управления структурой:

const csr = new KJUR.asn1.csr.CSR();

csr.setSubject("/C=RU/O=Org/CN=example.com");
csr.setPublicKey(pubKey);
csr.sign(prvKey, "SHA256withRSA");

const pem = csr.getPEM();

Парсинг CSR

Jsrsasign позволяет декодировать CSR из PEM для анализа его структуры:

const csr = new KJUR.asn1.csr.CSR({ pem: csrPem });

const subject = csr.subject;
const pubKey = csr.subjectPublicKey;
const sigAlg = csr.signatureAlg;

Работа с алгоритмами подписи

Поддерживаются стандартные алгоритмы:

  • SHA1withRSA
  • SHA256withRSA
  • SHA384withRSA
  • SHA512withRSA
  • ECDSAwithSHA256

Алгоритм влияет на формирование AlgorithmIdentifier и процесс вычисления подписи над DER-структурой CertificationRequestInfo.


Ошибки и особенности реализации

При работе с CSR через KJUR.asn1.csr часто возникают ограничения, связанные с:

  • обязательным наличием корректного X.500 имени субъекта
  • несовпадением ключевой пары (public/private)
  • неподдерживаемым алгоритмом подписи
  • отсутствием корректной DER-структуры при ручной сборке

Валидация обычно происходит на этапе sign() и verifySignature().


Взаимодействие с ключами

Классы CSR тесно связаны с RSA и ECDSA ключами из KEYUTIL:

const rsaKey = KEYUTIL.generateKeypair("RSA", 2048);

Публичный ключ извлекается и вставляется в CSR в формате SubjectPublicKeyInfo.


ASN.1 представление CSR

Структура CSR в ASN.1 нотации:

CertificationRequest ::= SEQUENCE {
  certificationRequestInfo CertificationRequestInfo,
  signatureAlgorithm AlgorithmIdentifier,
  signature BIT STRING
}

Jsrsasign полностью отражает эту структуру через объектную модель KJUR.asn1.csr.