Distinguished Name (DN) в инфраструктуре X.509 представляет собой структурированную строку, идентифицирующую субъекта или издателя сертификата. В рамках криптографических операций DN используется для однозначного описания сущности: пользователя, сервера, организации или устройства.
В формате X.509 DN состоит из набора атрибутов, представленных в виде
пар ключ–значение. Эти атрибуты формируют иерархическую структуру,
которая затем кодируется в ASN.1 DER при создании сертификатов.
Библиотека Jsrsasign предоставляет высокоуровневый механизм для
формирования таких структур через
KJUR.asn1.x509.X500Name.
DN в контексте X.509 обычно включает следующие элементы:
Каждый из этих компонентов является атрибутом RDN (Relative Distinguished Name). Несколько RDN объединяются в последовательность, образуя DN.
В ASN.1 представлении DN кодируется как:
Name ::= RDNSequenceRDNSequence ::= SEQUENCE OF RelativeDistinguishedNameRelativeDistinguishedName ::= SET OF AttributeTypeAndValueВ Jsrsasign класс KJUR.asn1.x509.X500Name предназначен
для создания ASN.1 структуры имени X.500, которая используется при
генерации сертификатов, CSR и других криптографических объектов.
Объект принимает на вход описание DN в виде объекта JavaScript или строки и преобразует его в ASN.1 структуру.
Наиболее распространённый способ задания DN — использование JavaScript-объекта:
var dn = new KJUR.asn1.x509.X500Name({
C: "RU",
ST: "Moscow",
L: "Moscow",
O: "Example Company",
OU: "IT Department",
CN: "example.com",
emailAddress: "admin@example.com"
});
Каждое свойство объекта соответствует одному атрибуту DN. Порядок свойств в объекте не всегда критичен, поскольку внутри ASN.1 структура упорядочивается согласно правилам X.500.
Jsrsasign также поддерживает строковый формат:
var dn = new KJUR.asn1.x509.X500Name(
"C=RU, ST=Moscow, L=Moscow, O=Example Company, OU=IT Department, CN=example.com"
);
При таком способе библиотека выполняет парсинг строки и преобразует её в внутреннюю ASN.1 структуру.
Особенности строкового формата:
При создании объекта X500Name происходит преобразование
входных данных в последовательность ASN.1 объектов:
KJUR.asn1.DERSet — представляет RDNKJUR.asn1.DERSequence — объединяет RDNSequenceKJUR.asn1.DERUTF8String или
DERPrintableString — кодирует значения атрибутовПример логической структуры:
SEQUENCE
├── SET
│ ├── AttributeTypeAndValue (C=RU)
├── SET
│ ├── AttributeTypeAndValue (ST=Moscow)
├── SET
│ ├── AttributeTypeAndValue (O=Example Company)
Jsrsasign автоматически выбирает тип кодирования значений:
Это важно при генерации сертификатов, поскольку несоответствие типов может привести к несовместимости с некоторыми TLS-реализациями.
DN, созданный через X500Name, часто используется в
объекте CSR:
var kp = KEYUTIL.generateKeypair("RSA", 2048);
var csr = new KJUR.asn1.csr.CSR({
subject: {
str: "C=RU, O=Example Company, CN=example.com"
},
sbjpubkey: kp.pubKeyObj,
sigalg: "SHA256withRSA",
sbjprvkey: kp.prvKeyObj
});
var pem = csr.getPEM();
В этом случае DN формируется как часть поля subject.
При более явном контроле можно передать объект X500Name
напрямую:
var subjectName = new KJUR.asn1.x509.X500Name({
C: "RU",
O: "Example Company",
CN: "example.com"
});
var csr = new KJUR.asn1.csr.CSR({
subject: subjectName,
sbjpubkey: kp.pubKeyObj,
sigalg: "SHA256withRSA",
sbjprvkey: kp.prvKeyObj
});
Такой подход позволяет избежать промежуточного строкового представления и уменьшает риск ошибок парсинга.
Помимо базовых полей, X500Name поддерживает расширенный
набор атрибутов:
DC — Domain ComponentserialNumber — серийный номер субъектаpostalCode — почтовый индексstreet — улицаtitle — должностьbusinessCategory — категория бизнесаПример расширенного DN:
var dn = new KJUR.asn1.x509.X500Name({
C: "US",
ST: "California",
L: "San Francisco",
O: "Tech Corp",
OU: "Security Division",
CN: "api.techcorp.com",
DC: "techcorp",
DC: "com",
serialNumber: "123456789"
});
Хотя в JavaScript-объекте порядок свойств может казаться нестрогим, в DN последовательность RDN имеет значение.
В ASN.1:
Jsrsasign при сериализации может нормализовать порядок в соответствии с внутренними правилами X.500.
Объект X500Name может быть преобразован в ASN.1 DER:
var asn1 = dn.getASN1Object();
var hex = asn1.getEncodedHex();
Этот HEX-представление используется при формировании сертификатов X.509.
При работе с X500Name часто возникают следующие
проблемы:
Пример ошибки:
"C=RU, O=Example, CN=John, Doe"
Запятая в CN без экранирования приведёт к неправильному разбору.
Корректный вариант:
"C=RU, O=Example, CN=\"John, Doe\""
DN, сформированный через X500Name, используется в:
В случае самоподписанных сертификатов Subject и Issuer часто совпадают:
var cert = new KJUR.asn1.x509.Certificate({
subject: dn,
issuer: dn,
pubkey: kp.pubKeyObj,
sigalg: "SHA256withRSA",
sbjprvkey: kp.prvKeyObj
});
Разные реализации X.509 могут по-разному интерпретировать DN:
Jsrsasign решает часть этих проблем за счёт унифицированного ASN.1 слоя, но конечная совместимость зависит от конечного потребителя сертификата.
После формирования DN он становится частью DER-структуры сертификата, которая затем кодируется в PEM:
-----BEGIN CERTIFICATE-----
MIIC...
-----END CERTIFICATE-----
DN внутри этого блока уже представлен в бинарном ASN.1 виде и не подлежит изменению без пересборки сертификата.
KJUR.asn1.x509.X500Name является связующим звеном
между:
Он обеспечивает единообразное представление идентичности субъекта в рамках всей библиотеки, исключая необходимость ручного построения ASN.1 деревьев.