Distinguished Name (DN) в инфраструктуре открытых ключей (PKI) представляет собой иерархическое описание субъекта сертификата. В X.509 сертификатах DN используется для идентификации владельца, издателя и других сущностей. В библиотеке Jsrsasign работа с DN основана на ASN.1 представлении и строгом соответствии стандарту X.500.
DN состоит из набора атрибутов (Relative Distinguished Names, RDN), каждый из которых представляет собой пару «тип = значение». Порядок и структура имеют значение, поскольку DN кодируется и сравнивается как последовательность компонентов.
На практике DN может выглядеть так:
C=RU, ST=Moscow, L=Moscow, O=Example Ltd, OU=IT Department, CN=example.com, emailAddress=admin@example.com
Каждое поле несет конкретную семантику и используется в проверке сертификатов, построении цепочек доверия и идентификации субъектов.
Поле C обозначает страну в формате ISO 3166-1 alpha-2.
Это один из самых формализованных компонентов DN.
Примеры:
C=RUC=USC=DEВ Jsrsasign это поле хранится как часть структуры X.500 имени и участвует в строгом сравнении DN.
Поле ST описывает регион или административную
область.
Примеры:
ST=MoscowST=CaliforniaST=BavariaЭто поле не является обязательным, но часто используется в корпоративных сертификатах.
Поле L указывает город или населённый пункт.
Примеры:
L=Saint PetersburgL=New YorkВ отличие от ST, значение L обычно более
локализовано.
Поле O представляет юридическое лицо или
организацию.
Примеры:
O=Google LLCO=Example BankO=Open Source InitiativeВ контексте сертификатов это одно из ключевых идентификационных полей.
Поле OU уточняет структуру внутри организации.
Примеры:
OU=IT DepartmentOU=Security DivisionOU=DevOpsВ корпоративных PKI системах может встречаться несколько OU в одном DN.
Поле CN является основным идентификатором субъекта.
Примеры:
CN=example.comCN=John DoeCN=VPN GatewayДля TLS-сертификатов CN часто используется как доменное
имя, хотя современные стандарты требуют проверки через SAN (Subject
Alternative Name).
Хотя формально не является частью строгого X.500 набора, поле
emailAddress широко используется.
Примеры:
emailAddress=admin@example.comВ Jsrsasign оно обрабатывается как дополнительный атрибут DN.
DN в сертификате X.509 кодируется через ASN.1 структуру
Name, которая представляет собой последовательность
RDNSequence.
Каждый RDN может содержать несколько атрибутов, объединённых логическим AND.
Пример ASN.1 структуры:
Name ::= CHOICE {
rdnSequence RDNSequence
}
RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
RelativeDistinguishedName ::= SET SIZE (1..MAX) OF AttributeTypeAndValue
Jsrsasign работает с этим представлением через внутренние ASN.1 классы, обеспечивая преобразование между строковым DN и бинарной DER-структурой.
В библиотеке Jsrsasign DN может быть представлен как строка или объект. Для разбора используется функциональность X.500 имени.
Пример создания объекта сертификата и извлечения DN:
const cert = new X509();
cert.readCertPEM(pemString);
const subject = cert.getSubject();
const issuer = cert.getIssuer();
Результат subject и issuer возвращается в
строковом формате DN.
Jsrsasign предоставляет утилиты для разбора DN на структурированные элементы.
Пример:
const x500 = new KJUR.asn1.x509.X500Name({ str: dnString });
const attrs = x500.getArray();
Каждый элемент массива содержит объект:
{
type: "CN",
value: "example.com"
}
Таким образом можно получить доступ к отдельным компонентам DN без ручного парсинга строки.
DN в строковом виде имеет ряд особенностей:
,=Пример:
CN=example.com, O=Example\, Inc., C=RU
Здесь запятая внутри организации экранирована, иначе парсер воспринял бы её как разделитель RDN.
Jsrsasign выполняет нормализацию DN при сравнении:
Пример нормализации:
cn=example.com,o=Example,c=RU
и
C=RU, O=Example, CN=example.com
могут считаться эквивалентными в зависимости от режима сравнения.
Сравнение DN используется при проверке цепочек сертификатов.
Пример:
const isEqual = KJUR.asn1.x509.X500Name.compare(
dn1,
dn2,
true
);
Флаг строгого сравнения учитывает порядок и точное соответствие структуры.
В нестрогом режиме сравниваются только пары ключ-значение.
DN может содержать составные RDN, например:
OU=Security+CN=Subsystem, O=Example Corp, C=RU
Здесь один RDN содержит два атрибута. Jsrsasign корректно интерпретирует такие структуры как SET внутри RDNSequence.
При разборе такие элементы возвращаются как массив внутри одного уровня:
[
[
{ type: "OU", value: "Security" },
{ type: "CN", value: "Subsystem" }
],
...
]
При генерации сертификатов DN преобразуется в ASN.1 DER.
Пример создания имени:
const dn = new KJUR.asn1.x509.X500Name({
str: "C=RU, O=Example, CN=example.com"
});
Далее DN включается в структуру сертификата:
const cert = new KJUR.asn1.x509.Certificate({
subject: { str: dnString },
issuer: { str: issuerDnString }
});
Jsrsasign автоматически строит ASN.1 дерево и сериализует его в DER.
При работе с DN часто возникают проблемы:
1. Неверное экранирование
O=Example, Inc.
воспринимается как два поля вместо одного.
Правильно:
O=Example\, Inc.
2. Дублирование атрибутов
CN=example.com, CN=other.com
Некоторые парсеры допускают это, но логика сравнения может быть неоднозначной.
3. Разный порядок компонентов
Хотя логически DN может быть равнозначным, в строгих реализациях порядок влияет на результат сравнения.
DN используется в следующих сценариях:
Jsrsasign позволяет извлекать DN и сравнивать его на уровне компонентов, что особенно важно при построении кастомной PKI логики.
Пример получения конкретного поля:
const x500 = new KJUR.asn1.x509.X500Name({ str: dn });
const cn = x500.getField("CN");
const o = x500.getField("O");
const c = x500.getField("C");
Если поле отсутствует, возвращается null.
В TLS-сертификатах DN используется совместно с расширением Subject Alternative Name. Несмотря на это, DN остаётся важным для:
Jsrsasign позволяет анализировать DN без зависимости от браузерного API, что делает библиотеку удобной для серверной криптографии в JavaScript среде.