Appendix B. ASN.1 Notes (ASN.1注释)
序列号和CRL编号
CA必须 (MUST) 强制serialNumber为非负整数, 也就是说, INTEGER值的DER编码中的符号位必须 (MUST) 为零. 如有必要, 可以通过添加前导 (最左边的) `00'H八位字节来完成. 这消除了八位字节字符串和整数值之间映射的潜在歧义.
如第4.1.2.2节所述, 可以预期序列号包含长整数. 证书用户必须 (MUST) 能够处理最多20个八位字节长度的serialNumber值. 符合标准的CA禁止 (MUST NOT) 使用长于20个八位字节的serialNumber值.
如第5.2.3节所述, 可以预期CRL编号包含长整数. CRL验证者必须 (MUST) 能够处理最多20个八位字节长度的cRLNumber值. 符合标准的CRL颁发者禁止 (MUST NOT) 使用长于20个八位字节的cRLNumber值.
SEQUENCE SIZE约束
构造"SEQUENCE SIZE (1..MAX) OF"出现在几个ASN.1构造中. 有效的ASN.1序列将有零个或多个条目. SIZE (1..MAX)构造约束序列至少有一个条目. MAX指示上限未指定. 实现可以自由选择适合其环境的上限.
字符串类型
PrintableString
字符串类型PrintableString支持非常基本的拉丁字符集: 小写字母'a'到'z', 大写字母'A'到'Z', 数字'0'到'9', 十一个特殊字符' = ( ) + , - . / : ?和空格.
实现者应注意, at符号 ('@') 和下划线 ('_') 字符不受ASN.1类型PrintableString支持. 这些字符经常出现在互联网地址中. 此类地址必须 (MUST) 使用支持它们的ASN.1类型进行编码. 它们通常编码为可辨别名称中的emailAddress属性或GeneralName的rfc822Name字段中的IA5String. 符合标准的实现禁止 (MUST NOT) 将包含at符号或下划线字符的字符串编码为PrintableString.
TeletexString
字符串类型TeletexString是PrintableString的超集. TeletexString支持相当标准的 (类似ASCII的) 拉丁字符集: 带有非间距重音的拉丁字符和日文字符.
UniversalString
字符串类型UniversalString支持 [ISO10646] 允许的任何字符. ISO 10646是通用多八位字节编码字符集 (UCS).
UTF8String
字符串类型UTF8String在1997版ASN.1中引入, UTF8String在2001版 [X.520] 中添加到DirectoryString的选择列表中. UTF8String是通用类型, 已被分配标签编号12. UTF8String的内容由RFC 2044定义并在RFC 2279中更新, 该版本在 [RFC3629] 中更新.
预见到这些变化, 并符合 [RFC2277] IETF字符集和语言最佳实践和IETF策略, 本文档在DirectoryString和userNotice证书策略限定符中包括UTF8String作为选择.
DirectoryString
对于 [X.520] 中定义的许多属性类型, AttributeValue使用DirectoryString类型. 在附录A中指定的属性中, name、surname、givenName、initials、generationQualifier、commonName、localityName、stateOrProvinceName、organizationName、organizationalUnitName、title和pseudonym属性都使用DirectoryString类型. X.520使用DirectoryString的参数化类型定义 [X.683] 来指定每个这些属性的语法. 参数用于指示属性允许的最大字符串长度. 在附录A中, 为了避免使用参数化类型定义, 对于每个这些属性类型的定义, DirectoryString类型以其展开形式编写. 因此, 附录A中的ASN.1将每个这些属性的语法描述为TeletexString、PrintableString、UniversalString、UTF8String和BMPString的CHOICE, 并对CHOICE中的每种类型应用适当的字符串长度约束, 而不是使用ASN.1类型DirectoryString来描述语法.
命名位列表
命名位列表是BIT STRING, 其中值已被分配名称. 此规范在密钥用途、CRL分发点和最新CRL证书扩展的定义中使用命名位列表, 以及最新CRL和颁发分发点CRL扩展. 当DER编码命名位列表时, 必须 (MUST) 省略尾随零. 也就是说, 编码值以设置为1的最后一个命名位结束.
DER编码规则
SET OF值的排序
实现者应注意, SET OF值的DER编码要求对值的编码进行排序. 特别是, 此问题与可辨别名称有关.
DEFAULT值的省略
实现者应注意, SET或SEQUENCE组件的DER编码, 其值为DEFAULT, 会从编码的证书或CRL中省略组件. 例如, cA值为FALSE的BasicConstraints扩展将从编码的证书中省略cA布尔值.
对象标识符 (OID)
对象标识符 (OID) 在整个规范中用于标识证书策略、公钥和签名算法、证书扩展等. OID没有最大大小. 此规范要求支持具有弧元素值小于2^28的OID, 即它们必须 (MUST) 在0和268,435,455之间 (包括两端). 这允许每个弧元素在单个32位字中表示. 实现还必须 (MUST) 支持点分十进制 (参见 [RFC4512] 第1.4节) 字符串表示长度最多可达100字节 (包括) 的OID. 实现必须 (MUST) 能够处理最多20个元素 (包括) 的OID. CA不应该 (SHOULD NOT) 颁发包含超过这些要求的OID的证书. 同样, CRL颁发者不应该 (SHOULD NOT) 颁发包含超过这些要求的OID的CRL.
nameConstraints扩展中的特殊编码规则
在nameConstraints扩展中编码GeneralName字段值的内容特定规则与在其他扩展中应用的规则不同. 在本文档中指定的所有其他证书、CRL和CRL条目扩展中, 编码规则符合底层类型的规则. 例如, uniformResourceIdentifier字段中的值必须包含 [RFC3986] 中指定的有效URI. 在nameConstraints扩展中编码值的内容特定规则在第4.2.1.10节中指定, 这些规则可能不符合底层类型的规则. 例如, 当uniformResourceIdentifier字段出现在nameConstraints扩展中时, 它必须包含DNS名称 (例如, "host.example.com"或".example.com") 而不是URI.
扩展性规则
实现者被警告, X.500标准社区已经开发了一系列扩展性规则. 这些规则确定何时可以更改ASN.1定义而不分配新的对象标识符 (OID). 例如, 至少有两个包含在 [RFC2459] 中的扩展定义 (此配置文件文档的前身) 在此规范中具有不同的ASN.1定义, 但使用相同的OID. 如果扩展中出现未知元素, 并且扩展未标记为关键, 则应忽略那些未知元素, 如下所示:
(a) 忽略位串中的所有未知位名称分配;
(b) 忽略ENUMERATED类型或以枚举样式使用的INTEGER类型中的所有未知命名数字, 前提是该数字作为SET或SEQUENCE的可选元素出现; 以及
(c) 忽略SET中的所有未知元素、SEQUENCE末尾的未知元素, 或CHOICE中的未知元素, 其中CHOICE本身是SET或SEQUENCE的可选元素.
如果包含意外值的扩展标记为关键, 则实现必须 (MUST) 拒绝包含无法识别的扩展的证书或CRL.