Класс KJUR.asn1.csr.CertificationRequest

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

CSR является фундаментальным элементом инфраструктуры открытых ключей (PKI), поскольку именно он передается в удостоверяющий центр (CA) для получения X.509 сертификата.


Структура CertificationRequest (PKCS#10)

Объект CertificationRequest соответствует ASN.1 структуре:

  • certificationRequest

    • certificationRequestInfo

      • version
      • subject
      • subjectPublicKeyInfo
      • attributes (опционально)
    • signatureAlgorithm

    • signatureValue

В контексте Jsrsasign эти части формируются автоматически при использовании класса KJUR.asn1.csr.CertificationRequest.


Назначение класса

KJUR.asn1.csr.CertificationRequest выполняет следующие задачи:

  • формирование CSR в формате PKCS#10
  • кодирование структуры в ASN.1 DER
  • подпись CSR с использованием приватного ключа
  • поддержка различных алгоритмов подписи (RSA, ECDSA, SHA-256 и др.)
  • генерация PEM-формата запроса

Основной результат работы класса — строка PEM:

-----BEGIN CERTIFICATE REQUEST-----
...
-----END CERTIFICATE REQUEST-----

Конструктор и базовые параметры

Создание объекта CertificationRequest осуществляется через конфигурационный объект.

Общий формат

new KJUR.asn1.csr.CertificationRequest(param)

Основные параметры

  • subject

    • DN (Distinguished Name) субъекта
    • задаётся в формате объекта или строки
  • sbjpubkey

    • публичный ключ субъекта
    • может быть RSAKey или ECDSA key object
  • sigalg

    • алгоритм подписи

    • например:

      • "SHA256withRSA"
      • "SHA384withECDSA"
  • sbjprvkey

    • приватный ключ для подписи CSR
  • extreq

    • расширения CSR (опционально)
    • используется для Subject Alternative Name, Key Usage и др.

Формирование субъекта (Subject DN)

Subject описывает владельца сертификата. Формат DN поддерживается в виде структуры:

subject: {
  str: "/C=US/O=Example/CN=example.com"
}

или через объект:

subject: {
  C: "US",
  O: "Example",
  CN: "example.com"
}

Поддерживаемые атрибуты:

  • C — страна
  • ST — регион/штат
  • L — город
  • O — организация
  • OU — подразделение
  • CN — общее имя
  • emailAddress — email

Публичный ключ в CSR

Публичный ключ передается через параметр sbjpubkey.

RSA пример

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"
});

ECDSA пример

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"
});

Алгоритмы подписи

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

  • SHA256withRSA
  • SHA384withRSA
  • SHA512withRSA
  • SHA256withECDSA
  • SHA384withECDSA
  • SHA512withECDSA

Выбор алгоритма влияет на безопасность и совместимость с удостоверяющими центрами.


Расширения CSR (Certificate Extensions)

Расширения добавляются через параметр extreq.

Пример SAN (Subject Alternative Name)

extreq: [
  {
    subjectAltName: {
      array: [
        { type: 2, value: "example.com" },
        { type: 2, value: "www.example.com" },
        { type: 7, ip: "192.168.0.1" }
      ]
    }
  }
]

Часто используемые расширения

  • subjectAltName
  • keyUsage
  • extKeyUsage
  • basicConstraints

Генерация CSR в PEM формате

После создания объекта CSR можно получить PEM:

const pem = csr.getPEM();

Результат:

-----BEGIN CERTIFICATE REQUEST-----
MIIC...==
-----END CERTIFICATE REQUEST-----

Внутренняя работа класса

Процесс генерации CSR включает несколько этапов:

1. Формирование CertificationRequestInfo

Собираются:

  • версия (обычно v1)
  • subject DN
  • subjectPublicKeyInfo
  • attributes (если заданы)

2. DER кодирование

Структура сериализуется в ASN.1 DER формат.

3. Подписание

Хэшируется CertificationRequestInfo и подписывается приватным ключом.

4. Сборка итоговой структуры

Объединяются:

  • CertificationRequestInfo
  • signatureAlgorithm
  • signatureValue

Использование с готовыми ключами

Импорт ключей

const prv = KEYUTIL.getKey(privateKeyPEM);
const pub = KEYUTIL.getKey(publicKeyPEM);

Формирование CSR

const csr = new KJUR.asn1.csr.CertificationRequest({
  subject: {
    C: "RU",
    O: "My Company",
    CN: "site.local"
  },
  sbjpubkey: pub,
  sbjprvkey: prv,
  sigalg: "SHA256withRSA"
});

Частые ошибки при генерации CSR

Несоответствие ключей

CSR не будет валиден, если публичный и приватный ключ не образуют пару.

Неподдерживаемый алгоритм

Некоторые CA не принимают SHA1 или слабые RSA ключи.

Ошибки DN

Некорректные поля subject могут привести к отклонению запроса:

  • пустой CN
  • неверный формат строки DN

Пример полного сценария генерации CSR

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
  • извлекается публичный ключ
  • анализируются расширения
  • формируется X.509 сертификат

CSR не содержит приватного ключа, что обеспечивает безопасность процесса.


ASN.1 представление 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
}

Работа с атрибутами CSR

Атрибуты позволяют расширять функциональность запроса:

  • challengePassword
  • extensionRequest

Пример:

attributes: [
  {
    extreq: [...]
  }
]

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

  • полностью клиентская реализация
  • не требует Node.js crypto API
  • поддерживает PEM и DER
  • совместим с большинством CA систем

Практические аспекты использования

  • CSR должен быть сгенерирован на стороне клиента или сервера, где хранится приватный ключ
  • приватный ключ никогда не передается в CA
  • один CSR соответствует одному ключевому набору
  • повторная генерация CSR с тем же ключом допустима