7

我正在解码 ASN.1 格式的 X.509 证书。我解码成功,遍历结构,但有一点我不明白。

在某些情况下,我得到一个八位字节字符串,而我正在玩的这个网站 ( http://lapo.it/asn1js/ ) 显示这些八位字节字符串实际上包含更多的 ASN.1 树。这个网站用(封装)注释了这样的八位字节字符串

我的问题是:在解析过程中我怎么知道一个八位字节字符串实际上封装了更多的东西?我是否只是尝试解析它,看看我是否得到标签和有效长度?如果不是,那么它是纯字节数据吗?如果是,那么它是一个有效的子树?

或者这是否意味着作为字节输出,然后消费者应该只在他知道它是来自某些键的编码数据时才尝试解析它?

以网站上已经加载的示例为例,然后点击“解码”。例如,我指的是偏移量 332,它是一个封装位字符串的八位字节字符串。

4

2 回答 2

8

这就是 ASN.1 中的“扩展”的样子(RFC 2459 §B.2 — 我知道 RFC 是“过时的”,但在以后的版本中没有那个有用的附录)。

Extensions ::= SEQUENCE OF Extension

Extension ::= SEQUENCE {
extnId     OBJECT IDENTIFIER,
critical   BOOLEAN DEFAULT FALSE,
extnValue  OCTET STRING }

每个扩展有效负载都封装在一个八位字节字符串中。扩展的 OID 告诉您在该八位字节字符串中会发生什么。在keyUsage的情况下,它是一个BIT STRING ( §4.2.1.3 )。

现在我对我自己关于subjectAltName的问题有了一个答案,它在§4.2.1.7中。

对内容使用 OCTET STRING 的一个好处是,根据规范,未知(非关键)扩展可以被识别为这样,并且可以轻松地跳过(尽管我认为 DER 也让它变得微不足道)。

于 2013-03-09T12:57:06.800 回答
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
于 2015-03-20T20:20:34.017 回答