Класс KJUR.asn1.DERPrintableString

ASN.1 тип PrintableString используется в криптографических структурах для представления строк, ограниченных набором допустимых символов. В спецификации ASN.1 (Abstract Syntax Notation One) этот тип относится к базовым строковым типам и предназначен для хранения текстовых данных, которые должны быть максимально совместимы между различными системами и протоколами.

В контексте формата DER (Distinguished Encoding Rules) объект DERPrintableString представляет собой конкретную реализацию кодирования PrintableString в библиотеке Jsrsasign. Он обеспечивает строгую сериализацию строки в бинарный формат ASN.1 DER, который используется в сертификатах X.509, CMS, PKCS и других криптографических структурах.


PrintableString допускает только ограниченный набор символов:

  • латинские буквы A–Z и a–z
  • цифры 0–9
  • пробел
  • символы: ' ( ) + , - . / : = ?

Любые другие символы считаются недопустимыми и приведут к ошибке при кодировании или некорректному результату в криптографических структурах.

Это ограничение критично для совместимости между различными реализациями ASN.1, особенно в сертификатах X.509.


Роль DERPrintableString в Jsrsasign

В библиотеке Jsrsasign класс KJUR.asn1.DERPrintableString является одним из примитивов ASN.1 и используется для создания узлов дерева ASN.1, которые затем могут быть включены в более сложные структуры:

  • X.509 сертификаты
  • CSR (Certificate Signing Request)
  • PKCS#7 / CMS структуры
  • произвольные ASN.1 сообщения

Объект выполняет задачу преобразования JavaScript-строки в DER-кодированное представление PrintableString.


Конструктор KJUR.asn1.DERPrintableString

Базовая сигнатура конструктора:

new KJUR.asn1.DERPrintableString(params)

Параметры

Объект params может содержать следующие поля:

  • str — строка, которая будет закодирована как PrintableString
  • explicit — флаг явного тегирования (используется в сложных ASN.1 структурах)
  • tag — переопределение ASN.1 тега (редко используется)
  • ignoreError — подавление ошибок при наличии недопустимых символов

Пример:

var asn1 = new KJUR.asn1.DERPrintableString({
  str: "JOHN DOE"
});

Внутреннее поведение кодирования

При создании объекта происходит несколько этапов обработки:

1. Проверка допустимых символов

Строка анализируется на соответствие PrintableString. Если встречается недопустимый символ (например, кириллица или символы Unicode вне допустимого набора), выбрасывается ошибка.

2. Кодирование в ASN.1 тег

PrintableString имеет фиксированный тег:

  • Tag Number: 19 (0x13)

3. DER сериализация

Формируется структура:

[Tag][Length][Value]

Где:

  • Tag — 0x13
  • Length — длина строки в байтах
  • Value — ASCII представление строки

Пример базового использования

var KJUR = require("jsrsasign");

var ps = new KJUR.asn1.DERPrintableString({
  str: "TEST USER"
});

console.log(ps.getEncodedHex());

Результатом будет DER-кодированная строка в шестнадцатеричном виде.


Использование в структуре X.509

PrintableString часто используется для полей сертификатов, например:

  • Country Name (C)
  • Organization Name (O)
  • Organizational Unit (OU)
  • Common Name (CN) — в некоторых случаях

Пример включения в ASN.1 последовательность:

var seq = new KJUR.asn1.DERSequence({
  array: [
    new KJUR.asn1.DERPrintableString({ str: "RU" }),
    new KJUR.asn1.DERPrintableString({ str: "My Company" })
  ]
});

Поведение при ошибках

Если строка содержит недопустимые символы:

new KJUR.asn1.DERPrintableString({
  str: "Тест"
});

поведение зависит от параметра ignoreError:

  • по умолчанию → ошибка генерации
  • ignoreError: true → возможна некорректная кодировка или замена символов

Отличие от других строковых типов ASN.1

В Jsrsasign существуют альтернативы:

  • DERUTF8String — поддерживает полный Unicode
  • DERIA5String — ограничен ASCII (0–127)
  • DERPrintableString — ограниченный набор символов ASN.1

Ключевое отличие PrintableString — баланс между совместимостью и ограничением символов. Он чаще используется в стандартизированных полях сертификатов, где важна предсказуемость кодировки.


Методы объекта

getEncodedHex()

Возвращает DER-представление в hex формате:

var hex = ps.getEncodedHex();

toString()

Возвращает строковое представление объекта (в основном для отладки).

ASN.1 сериализация

Объект участвует в сборке дерева ASN.1 через внутренние методы Jsrsasign и может быть включён в:

  • DERSequence
  • DERSet
  • DERTaggedObject

Практическое применение в криптографии

DERPrintableString активно используется в:

Сертификаты X.509

Например, при генерации subject полей:

  • C=US
  • O=Example Corp
  • CN=example.com

PKI инфраструктура

Используется в инфраструктуре открытых ключей для хранения метаданных, которые должны быть строго стандартизированы.

Совместимость с OpenSSL

PrintableString гарантирует корректное взаимодействие с реализациями OpenSSL, поскольку DER-кодирование строго соответствует RFC 5280.


Ограничения и особенности

Жёсткая ограниченность символов

Это главный источник ошибок при использовании:

  • кириллица не поддерживается
  • эмодзи недопустимы
  • большинство Unicode символов запрещены

Потенциальная потеря данных

При попытке кодировать неподдерживаемый текст возможны:

  • исключения
  • некорректные сертификаты
  • несовместимость с валидаторами X.509

Использование только там, где требуется стандарт

PrintableString не является универсальным типом строки и не подходит для пользовательского ввода без предварительной нормализации.


Взаимодействие с ASN.1 деревьями

В Jsrsasign все DER-объекты формируют иерархию:

DERSequence
 ├── DERPrintableString
 ├── DERInteger
 ├── DERBitString

DERPrintableString всегда является листовым узлом, не содержащим вложенных структур.


Рекомендации по применению

  • использовать только для строго стандартизированных полей
  • заранее валидировать строки перед созданием объекта
  • не применять для пользовательского или интернационального текста
  • при сомнениях предпочитать DERUTF8String