В ASN.1 (Abstract Syntax Notation One) строковые типы используются для строгого представления текстовых данных в сертификатах, ключах и других криптографических структурах. Библиотека jsrsasign реализует поддержку этих типов при формировании и разборе ASN.1-объектов, включая X.509 сертификаты, PKCS#10 запросы и CMS структуры.
Каждый строковый тип ASN.1 отличается набором допустимых символов, правилами кодирования и областью применения. Ошибочный выбор типа может привести к несовместимости с криптографическими библиотеками, отказу валидации сертификата или нарушению стандартов RFC.
UTF8String — один из наиболее универсальных строковых типов ASN.1. Он поддерживает полный набор Unicode-символов, что делает его стандартом де-факто для современных систем.
В jsrsasign UTF8String применяется при кодировании данных, которые могут содержать международные символы, включая кириллицу, иероглифы и специальные знаки.
Основные характеристики:
Пример использования в структуре ASN.1:
var asn1 = KJUR.asn1;
var utf8 = new asn1.DERUTF8String({
str: "Пример текста"
});
UTF8String часто используется для полей:
При формировании сертификатов рекомендуется использовать UTF8String по умолчанию, если нет строгих ограничений совместимости.
PrintableString — ограниченный строковый тип, допускающий только набор символов из базового латинского алфавита, цифр и ограниченного набора специальных символов.
Допустимые символы:
Особенности:
Пример в jsrsasign:
var printable = new KJUR.asn1.DERPrintableString({
str: "Example Organization"
});
Использование PrintableString характерно для:
При попытке поместить недопустимый символ библиотека может выбросить ошибку или привести к некорректному кодированию.
IA5String основан на наборе символов ASCII (IA5 — International Alphabet No. 5). Он поддерживает 7-битную кодировку и используется в специфических полях, где требуется строгая ASCII-совместимость.
Особенности:
Пример:
var ia5 = new KJUR.asn1.DERIA5String({
str: "user@example.com"
});
IA5String применяется в:
В отличие от UTF8String, IA5String гарантирует максимальную совместимость с сетевыми протоколами и старыми системами, где Unicode не поддерживается.
BMPString (Basic Multilingual Plane String) используется для кодирования символов из базовой многоязычной плоскости Unicode (U+0000 — U+FFFF).
Характеристики:
Пример:
var bmp = new KJUR.asn1.DERBMPString({
str: "Тестовое значение"
});
BMPString исторически использовался в ранних PKI-реализациях, когда UTF8String ещё не был универсально принят.
T61String — устаревший строковый тип, связанный с телетекстовой кодировкой. Используется в старых телекоммуникационных стандартах и ранних версиях X.509.
Особенности:
Пример в jsrsasign:
var t61 = new KJUR.asn1.DERT61String({
str: "Legacy data"
});
В современных системах практически не применяется, но может встречаться в старых сертификатах.
NumericString ограничен цифрами и пробелами. Используется в ситуациях, где требуется строго числовое представление данных.
Допустимые символы:
Пример:
var numeric = new KJUR.asn1.DERNumericString({
str: "12345 67890"
});
Применение:
VisibleString — расширение PrintableString, включающее более широкий набор печатных символов ASCII.
Особенности:
Пример:
var visible = new KJUR.asn1.DERVisibleString({
str: "Visible text!"
});
UniversalString использует 32-битное кодирование символов Unicode, что обеспечивает максимальную совместимость с расширенными наборами символов.
Особенности:
Пример:
var universal = new KJUR.asn1.DERUniversalString({
str: "Unicode текст"
});
На практике используется крайне редко из-за большого объёма данных.
В структуре X.509 выбор строкового типа влияет на интероперабельность сертификатов между системами.
Типичные правила:
Пример конфликтной ситуации:
В jsrsasign строковые типы представлены отдельными конструкторами:
Каждый из них наследует общую модель DER-энкодинга и преобразуется в ASN.1 TLV структуру:
Библиотека автоматически выполняет:
При работе со строковыми типами часто возникают ошибки:
Типичная ошибка в jsrsasign:
Такие ошибки возникают на этапе построения ASN.1 структуры, до формирования сертификата или запроса.
Реальные PKI-системы опираются на строгие профили:
В этих документах определено:
Нарушение этих правил может привести к:
Distinguished Name (DN) в X.509 сертификатах представляет собой набор атрибутов, каждый из которых может использовать свой ASN.1 строковый тип:
Выбор типа зависит от:
UTF8String постепенно вытеснил PrintableString в большинстве современных реализаций DN.