Поля CSR: subject, publicKey, attributes

В CSR (Certificate Signing Request) в контексте Jsrsasign формируется ASN.1-структура запроса на сертификат, соответствующая PKCS#10. Внутри этой структуры ключевыми компонентами выступают subject, publicKey и attributes. Эти поля определяют идентичность владельца ключа, сам криптографический материал и дополнительные расширения запроса.


subject: Distinguished Name как основа идентификации

Поле subject описывает субъект сертификата в формате Distinguished Name (DN). Это структурированное имя, состоящее из набора атрибутов, которые однозначно идентифицируют владельца ключевой пары.

Типичная структура subject включает:

  • CN (Common Name) — основное имя субъекта (домен, пользователь или сервис)
  • O (Organization) — организация
  • OU (Organizational Unit) — подразделение
  • C (Country) — страна
  • L (Locality) — город
  • ST (State or Province) — регион

В Jsrsasign DN задаётся либо строкой, либо объектной формой.

Пример строкового представления:

subject = "/C=RU/ST=Moscow/L=Moscow/O=Example Corp/OU=IT/CN=example.com";

Объектная форма используется при более строгой генерации:

subject = {
  C: "RU",
  ST: "Moscow",
  L: "Moscow",
  O: "Example Corp",
  OU: "IT",
  CN: "example.com"
};

При формировании CSR библиотека преобразует subject в ASN.1 структуру Name, которая затем встраивается в CertificationRequestInfo.

Важная особенность заключается в том, что subject не является просто текстовым идентификатором — он кодируется как последовательность Relative Distinguished Names (RDN), где каждый элемент представляет собой атрибут X.509.


publicKey: криптографическое ядро CSR

Поле publicKey содержит открытый ключ, который будет связан с будущим сертификатом. Этот ключ соответствует закрытому ключу, который остаётся у владельца и используется для подписи данных.

В Jsrsasign publicKey может быть представлен в нескольких формах:

  • PEM-строка
  • объект ключа (RSAKey, KJUR.crypto.ECDSA)
  • DER-кодированный ключ

Пример использования RSA ключа:

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

const csr = new KJUR.asn1.csr.CertificationRequest({
  subject: "/C=RU/O=Example/CN=example.com",
  sbjpubkey: kp.pubKeyObj,
  sigalg: "SHA256withRSA",
  sbjprvkey: kp.prvKeyObj
});

Здесь sbjpubkey является фактическим контейнером для publicKey.

На уровне ASN.1 структура выглядит как SubjectPublicKeyInfo, включающая:

  • алгоритм (OID RSA, EC и др.)
  • битовое представление ключа

Ключевая роль publicKey в CSR заключается в том, что удостоверяющий центр (CA) позже будет использовать его для формирования X.509 сертификата, привязанного к данному ключу.

Важно, что publicKey не шифруется в CSR — он передаётся открыто, поскольку является публичной частью криптографической пары.


attributes: расширения и дополнительные параметры запроса

Поле attributes в CSR используется для передачи дополнительных структур данных, которые не входят в subject или publicKey. В PKCS#10 они представлены как набор атрибутов типа Attribute.

Наиболее часто используемым атрибутом является:

  • extensionRequest (OID: 1.2.840.113549.1.9.14)

Он позволяет запрашивать расширения X.509 сертификата, такие как:

  • Subject Alternative Name (SAN)
  • Key Usage
  • Extended Key Usage
  • Basic Constraints

Пример задания attributes в Jsrsasign:

attributes: [
  {
    extname: "subjectAltName",
    array: [
      { dns: "example.com" },
      { dns: "www.example.com" },
      { email: "admin@example.com" }
    ]
  }
]

Внутри CSR это преобразуется в ASN.1 структуру Attribute, содержащую AttributeType и AttributeValueSet.


Связь attributes с extensionRequest

Jsrsasign автоматически кодирует расширения в формате X.509 Extensions через ExtensionRequest.

Пример формирования SAN через attributes:

const csr = new KJUR.asn1.csr.CertificationRequest({
  subject: "/C=RU/O=Example/CN=example.com",
  sbjpubkey: kp.pubKeyObj,
  sbjprvkey: kp.prvKeyObj,
  sigalg: "SHA256withRSA",
  extreq: [
    {
      extname: "subjectAltName",
      array: [
        { dns: "example.com" },
        { dns: "api.example.com" }
      ]
    }
  ]
});

Внутри структуры CSR это преобразуется в:

Attribute:
  type = extensionRequest
  value = SEQUENCE OF Extensions

Внутреннее представление CSR в Jsrsasign

На уровне ASN.1 CSR состоит из трёх ключевых блоков:

  1. CertificationRequestInfo

    • subject
    • subjectPublicKeyInfo
    • attributes
  2. signatureAlgorithm

  3. signatureValue

Связь полей:

  • subject → идентификация владельца
  • publicKey → криптографическая привязка
  • attributes → расширенные требования сертификата

Особенности кодирования subject и attributes

Subject и attributes кодируются по разным ASN.1 правилам:

  • subject использует NameRDNSequence
  • attributes используют Attribute ::= SEQUENCE { type, values }

При этом attributes могут содержать как простые OID-значения, так и сложные структуры (например, набор расширений сертификата).


Практическая модель формирования CSR

Внутренняя логика Jsrsasign при сборке CSR:

  1. Формирование subject как DER-кодированного Name
  2. Инкапсуляция publicKey в SubjectPublicKeyInfo
  3. Кодирование attributes (если заданы)
  4. Формирование CertificationRequestInfo
  5. Подпись приватным ключом
  6. Генерация signatureValue

Взаимодействие полей при проверке CSR

При проверке CSR сервером CA происходит:

  • декодирование subject для определения владельца
  • извлечение publicKey для будущего сертификата
  • анализ attributes для формирования расширений

Если attributes содержат extensionRequest, CA может:

  • принять расширения полностью
  • частично изменить
  • полностью игнорировать

В отличие от subject и publicKey, attributes не являются обязательными для валидности CSR.


Типичные ошибки при формировании полей

При работе с Jsrsasign часто встречаются ошибки:

  • некорректный формат subject (например, отсутствие /CN=)
  • несоответствие publicKey и privateKey
  • неверная структура attributes (невалидный OID или массив)
  • попытка передачи расширений вне extensionRequest

Роль каждого поля в безопасности CSR

  • subject определяет идентичность, но не гарантирует её достоверность
  • publicKey обеспечивает криптографическую привязку
  • attributes задают дополнительные правила, влияющие на будущий сертификат

Совместно они формируют минимально достаточный набор данных для запроса сертификата в инфраструктуре X.509