【问题标题】:ASN.1 Octet StringsASN.1 八位组字符串
【发布时间】:2013-02-24 07:18:53
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 在该示例中,偏移量 332 是 keyUsage,即 just a bitstring。一个更有趣的例子可能是 subjectAltName 2.5.29.17,该证书中不存在,但 google.com 有一个很好的用于测试解析的例子。
  • 抱歉,为了清楚起见,我的意思是 google.com https 网站上的证书,它有 40 多个 altName。这不是 LMGTFY ;-)
  • @mr.spuratic Offset 332 在该示例中具有包含位串的八位字节串。我的问题是是否有某种规则我可以​​推断出一个原语封装了其他东西。还是我只是尝试解码它,如果长度和类型都有效,然后取而代之的是解码的值?或者我会从一些规范中知道像 subjectAltName 这样的东西总是一个八位字节字符串,它可以编码更多的东西?

标签: decoding asn.1


【解决方案1】:

这就是 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 也使其变得微不足道)。

【讨论】:

  • 对一个 ASN1 问题很久以来的最佳解释。 ;-)
  • 当我解码 OCTET STRING 时;如果没有可用的 DEFN (OID),那么我测试它是否包含 VALID ASN1 序列和双重解码作为 BLOB,如果有效则作为 CONTAINED 序列。
  • 请注意,对于 CRITICAL: 的情况,DER 编码有关于不包括 DEFAULT 值(冗余)的特殊规则。因此,您可能看不到 ASN1 中存在的 BOOLEAN,具体取决于用于 EXTENSION 的 SCHEMA。
【解决方案2】:

告诉 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 2020-12-24
    • 2010-11-17
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多