2013-03-08 91 views
4

我正在解码ASN.1格式的X.509证书。我正在解码它,遍历结构,但有一件事我不明白。ASN.1 Octet字符串

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

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

或者这是否意味着输出为字节,然后消费者应该只尝试解析它,如果他知道它是某些密钥的编码数据?

拿出已经加载到网站上的例子,并点击“解码”。我指的是偏移332,这是一个封装了位串的八位组串。

+0

偏移332在这个例子是*的keyUsage *,这是[只是一个比特串(HTTP:/ /www.alvestrand.no/objectid/2.5.29.15.html)。一个更有趣的例子可能是'subjectAltName' 2.5.29.17,该证书中不存在,但https://google.com/具有很好的测试解析功能。 – 2013-03-08 17:12:07

+0

对不起,我想说明一下,我的意思是google.com https网站上的证书,它有40多个altNames。这是*不* LMGTFY ;-) – 2013-03-08 18:50:08

+0

@ mr.spuratic该例中的偏移量332有一个包含位串的八位组串。我的问题是,如果有某种规则,我可以推断出一个原始封装别的东西。或者我只是试图解码它,如果长度和类型都工作,然后取代解码的值?或者我可以从某些规范知道像subjectAltName这样的东西总是一个八位字节字符串,它可以编码更多的东西吗? – Cocoanetics 2013-03-09 11:27:49

回答

7

这就是ASN.1 speak中的“扩展”的样子(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

很长一段时间我得到了一个ASN1问题的最佳解释。 ;-) – Cocoanetics 2013-03-10 09:08:22

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