我很难理解RDN(RelativeDistinguishedName)中属性(AttributeTypeAndValue)的排序。
以下是相关的ASN.1定义(取自www.in2eps.com):
即tbsCertificate
TBSCertificate ::= SEQUENCE {
[...]
subject Name,
[...]
}
命名
Name ::= CHOICE {
rdnSequence RDNSequence
}
RDNSequence
RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
RelativeDistinguishedName
RelativeDistinguishedName ::= SET SIZE (1 .. MAX) OF AttributeTypeAndValue
AttributeTypeAndValue
AttributeTypeAndValue ::= SEQUENCE {
type AttributeType,
value AttributeValue
}
属性类型
AttributeType ::= OBJECT IDENTIFIER
的AttributeValue
AttributeValue ::= ANY -- DEFINED BY AttributeType
如果我创建的CSR包含" / CN = CommonNameX / O = OrganizationX /..." (按此特定顺序),CA如何构建证书?
在将主题设置为" ... / O = OrganizationX / CN = CommonNameX /"时,如何构建证书? (顺序相反)?
据我所知,在验证证书链时,RDN属性的排序很重要。因此,我认为必须有一些详细的规范?
更重要的是,我还想知道是否有不同的CA使用不同的排序。如果是这样,有人可以指出一些CA吗?
修改
在阅读完第一个答案之后,我意识到我要求的东西与预期的完全不同。简而言之:如果 RDN序列中元素的排序很重要,那么预期的问题是。
对于这种困惑感到抱歉,我会在事后纠正问题的标题......
答案 0 :(得分:4)
如果我创建一个包含“/ CN = CommonNameX / O = OrganizationX / ...”的CSR(按此特定顺序),CA如何构建证书?
一个体面的CA实际上应该忽略CSR中提交的DN,并根据其验证的信息构建主题DN。也就是说,通常,他们会根据自己的CA策略放置自己的国家/地区,组织,OU(等等)。他们会将CN更改为您申请的主机的CN(例如,或者根据证书类型,与申请流程相关的任何其他内容)。企业社会责任中的内容对于跟踪申请过程中提交的公钥的身份非常有用,但它最多可用于管理目的。
据我所知,在验证证书链时,RDN属性的排序很重要。因此,我认为必须有一些详细的规范?
是的,重要的订单RDNSequence
确实是SEQUENCE OF RelativeDistinguishedName
。每个RDN本身都是AVA(属性值断言/ AttributeTypeAndValue
)的集合(无序):SET SIZE (1 .. MAX) OF AttributeTypeAndValue
。
每个RDN内容(AVA集合)和每个DN(RDN序列)的匹配规则在RFC 5280中定义:
Two naming attributes match if the attribute types are the same and the values of the attributes are an exact match after processing with the string preparation algorithm. Two relative distinguished names RDN1 and RDN2 match if they have the same number of naming attributes and for each naming attribute in RDN1 there is a matching naming attribute in RDN2. Two distinguished names DN1 and DN2 match if they have the same number of RDNs, for each RDN in DN1 there is a matching RDN in DN2, and the matching RDNs appear in the same order in both DNs. A distinguished name DN1 is within the subtree defined by the distinguished name DN2 if DN1 contains at least as many RDNs as DN2, and DN1 and DN2 are a match when trailing RDNs in DN1 are ignored.
基本上,DN中的RDN需要按正确的顺序排序(SEQUENCE
是有序的),但AVA的顺序不是(SET
没有排序):“ 2相对可分辨名称RDN1和RDN2匹配,如果它们具有相同数量的命名属性,并且对于RDN1中的每个命名属性,RDN2中都有匹配的命名属性。“
实际上,大多数CA仅为每个RDN使用一个属性值对。如果依赖于文本序列化(例如RFC 2253)的许多实现(不一定是SSL / TLS堆栈的一部分,但也可以是其上的身份验证/授权层),我不会感到惊讶被多个AVA混淆(更具体地说,它们的顺序在每个RDN中无关紧要,因此您可以有两个不同的文本序列,实际上是等效的。)
答案 1 :(得分:3)
(作为@ CryptoGuy的附录,回答了DN比较的一些背景知识)
Internet X.509公钥基础结构证书上的基本IETF规范为RFC 5280。
比较专有名称的规则在Section 7.1中指定。他们是:
因此,两个DN必须被视为相等,即使它们在某个匹配的相对可分辨名称中按命名属性的顺序不同。
不幸的是,在这方面有相关数量的节目在这方面失败了。因此,为了安全起见,只需在每个RDN中添加一个命名属性。
关于@CryptoGuy在他的回答中提到的树结构,它更正式地定义如下7.1节:
答案 2 :(得分:1)
这是预期的行为。 RDN属性是X.500可分辨名称的一部分,它是一棵树。树是从根节点开始并通过添加嵌套的子节点构建的。例如,主题CN=John Wayne, OU=IT Department, DC=contoso, DC=com
将按如下方式构建:
这就是RDN以相反顺序放置的原因。为方便起见,证书查看器会反向首先显示主体名称的RDN属性排序。
如果我创建的CSR包含" / CN = CommonNameX / O = OrganizationX /..." (按此特定顺序),CA如何构建证书?
CA不会更改主题名称中的RDN属性顺序,因为它们已在证书申请中反转。您可以在任何ASN.1查看器中打开生成的请求文件,以获取二进制请求中RDN属性的实际顺序。
更重要的是,我还想知道是否有不同的CA使用不同的排序。如果是这样,有人可以指向我一些可用的CA吗?
我使用的所有CA都如上所述(在编码X.500名称时使用反向排序)。
编辑:专有名称的表示形式在[RFC1779]
中定义edit2(对于RDN序列顺序重要性问题):正如已经说过的那样,这很重要。当CA签署证书时,它应将RDN放在Issuer字段中,其顺序与它们在其自己的证书的Subject字段中出现的顺序相同。
答案 3 :(得分:0)
该问题的主要答案是准确的,除了DER编码(X.690)ASN.1中RDN的顺序。 SET OF ASN.1构造类型的DER编码意味着您必须对所有Attribute-Type-And-Value项进行比较,以比较它们的DER编码(比较时,较短的DER编码必须填充零)。 资料来源:ITU-T X.690 11.6“组件集”。 请注意,当今X.509v3绝大多数证书的确是DER编码的。