跳到主要内容

2. 将可分辨名称从 ASN.1 转换为字符串

X.501 [X.501] 定义了可分辨名称的 ASN.1 [X.680] 结构。下面给出为便于讨论而提供的一个变体:

DistinguishedName ::= RDNSequence

RDNSequence ::= SEQUENCE OF RelativeDistinguishedName

RelativeDistinguishedName ::= SET SIZE (1..MAX) OF
AttributeTypeAndValue

AttributeTypeAndValue ::= SEQUENCE {
type AttributeType,
value AttributeValue }

本节定义把可分辨名称从 ASN.1 结构化表示转换为 UTF-8 [RFC3629] 编码的 Unicode [Unicode] 字符串表示的推荐 (RECOMMENDED) 算法。其他文档可以描述把可分辨名称转换为字符串的其他算法,但 LDAP 实现只能 (SHALL) 产生符合第 3 节所定义语法的字符串。

2.1. 转换 RDNSequence​

如果 RDNSequence 是空序列,则结果为空字符串(零长度字符串)。

否则,输出由 RDNSequence 中每个 RelativeDistinguishedName 的字符串编码组成(依据第 2.2 节),从序列的最后一个元素开始,向第一个元素倒序进行。

相邻 RelativeDistinguishedName 的编码之间以逗号 (',' U+002C) 字符分隔。

2.2. 转换 RelativeDistinguishedName​

把 ASN.1 的 RelativeDistinguishedName 转换为字符串时,输出由其中每个 AttributeTypeAndValue 的字符串编码组成(依据第 2.3 节),顺序不限。

当存在多值 RDN 时,相邻 AttributeTypeAndValue 的输出之间以加号 ('+' U+002B) 字符分隔。

2.3. 转换 AttributeTypeAndValue​

AttributeTypeAndValue 编码为:AttributeType 的字符串表示,后接一个等号 ('=' U+003D) 字符,再后接 AttributeValue 的字符串表示。AttributeValue 的编码在第 2.4 节给出。

如果 AttributeType 被定义为具有短名(描述符)[RFC4512],并且已知该短名已注册 [REGISTRY][RFC4520] 用于标识该 AttributeType,则使用该短名(一个 )。否则,AttributeType 编码为其 OBJECT IDENTIFIER 的点分十进制编码(一个 )。 和 在 [RFC4512] 中定义。

实现无需动态更新其已注册短名的知识。但实现应当 (SHOULD) 提供一种机制,允许更新其已注册短名的知识。

2.4. 把 AttributeValue 从 ASN.1 转换为字符串​

如果 AttributeType 是点分十进制形式,则 AttributeValue 表示为一个数字符号 ('#' U+0023) 字符,后接 X.500 AttributeValue 的 BER 编码中每个八位组的十六进制编码。当 AttributeValue 的语法没有为其定义 LDAP 特定的字符串编码([RFC4517] 第 3.1 节),或者该 LDAP 特定的字符串编码不限于 UTF-8 编码的 Unicode 字符时,也使用这种形式。这种形式也可以用于其他情况,例如当需要可逆的字符串表示时(见第 5.2 节)。

否则,如果 AttributeValue 属于具有 LDAP 特定字符串编码的语法,则先根据其语法规范把该值转换为 UTF-8 编码的 Unicode 字符串(示例见 [RFC4517] 第 3.3 节)。如果该 UTF-8 编码的 Unicode 字符串不包含下列任何需要转义的字符,那么该字符串可直接用作值的字符串表示。

  • 出现在字符串开头的空格 (' ' U+0020) 或数字符号 ('#' U+0023);
  • 出现在字符串末尾的空格 (' ' U+0020) 字符;
  • 字符 '"'、'+'、','、';'、'<'、'>' 或 '' 之一(分别为 U+0022、U+002B、U+002C、U+003B、U+003C、U+003E、U+005C);
  • 空 (U+0000) 字符。

其他字符也可以被转义。

待转义字符的每个八位组都被替换为一个反斜杠加两个十六进制数字,这两个十六进制数字构成该字符编码中的一个八位组。或者,当且仅当待转义字符是下列字符之一时:

' ', '"', '#', '+', ',', ';', '<', '=', '>', 或 '\'
(分别为 U+0020, U+0022, U+0023, U+002B, U+002C, U+003B,
U+003C, U+003D, U+003E, U+005C)

也可以直接在其前面加一个反斜杠 ('' U+005C)。

转义机制的示例见第 4 节。