我正在以ASN.1格式解码X.509证书。我正在成功地解码它,遍历结构,但有一件事我不明白。
在某些情况下,我得到一个八位字符串,我正在玩的这个网站(http://lapo.it/asn1js/)表明这些八位字节字符串实际上包含更多的ASN.1树。该网站用(封装)
注释这样的八位字符串我的问题是:我在解析过程中如何知道八位字符串实际上是否封装了更多内容?我是否只是尝试解析它,看看我是否有标签和有效长度?如果不是那么它是纯字节数据?如果是,那么它是一个有效的子树?
或者这是否意味着以字节形式输出,然后消费者只应该尝试解析它,如果他知道它是某些键的编码数据?
以网站上已加载的示例为例,点击“解码”。我是指例如偏移332,它是一个封装位串的八位字节串。
答案 0 :(得分:7)
这就是“扩展”在ASN.1中的样子(RFC 2459 §B.2 - 我知道RFC是“过时的”,但在后面的版本中没有这个有用的附录。)
Extensions ::= SEQUENCE OF Extension
Extension ::= SEQUENCE {
extnId OBJECT IDENTIFIER,
critical BOOLEAN DEFAULT FALSE,
extnValue OCTET STRING }
每个扩展有效负载都封装在OCTET STRING中。扩展的OID告诉您在该八位字符串中期望什么。 如果是 keyUsage ,则为BIT STRING(§4.2.1.3)。
现在我对 subjectAltName 的问题有一个答案,它位于§4.2.1.7。
对内容使用OCTET STRING的一个好处是,根据规范,未知(非关键)扩展可以被识别,并且可以轻易地被忽略(尽管我认为DER也使其变得微不足道)。
答案 1 :(得分:1)
告诉ASN.1工具处理封装的方法是使用关键字" CONTAINING"。例如(这不是实际/正确的证书规范,但它应该给你一个想法):
TstCert DEFINITIONS IMPLICIT TAGS ::=
BEGIN
Sun ::= SEQUENCE {
subjAltType OBJECT IDENTIFIER,
name GenNames
}
GenNames ::= SEQUENCE SIZE (1..5) OF GenName
GenName ::= CHOICE {
otherName [0] OtherName,
rfc822Name [1] UTF8String
}
OtherName ::= OCTET STRING (CONTAINING SEQUENCE {
type-id OBJECT IDENTIFIER,
value [0] EXPLICIT UTF8String
} )
END