首页 > 解决方案 > ASN.1 语法的“序列”中的数字是什么意思?

问题描述

这是一个例子:

 TBSCertificate  ::=  SEQUENCE  {
     version         [0]  EXPLICIT Version DEFAULT v1,
     serialNumber         CertificateSerialNumber,
     signature            AlgorithmIdentifier,
     issuer               Name,
     validity             Validity,
     subject              Name,
     subjectPublicKeyInfo SubjectPublicKeyInfo,
     issuerUniqueID  [1]  IMPLICIT UniqueIdentifier OPTIONAL,
                          -- If present, version must be v2 or v3
     subjectUniqueID [2]  IMPLICIT UniqueIdentifier OPTIONAL,
                          -- If present, version must be v2 or v3
     extensions      [3]  EXPLICIT Extensions OPTIONAL
                          -- If present, version must be v3
     }

数字[0], [1], ... 是什么意思,什么时候需要它们?没有这样的数字是什么意思?

标签: asn.1

解决方案


它们被称为标签编号,当使用 TLV(标签长度值)形式时(例如 ASN.1 基本编码规则),它们被用于(连同可以跟随的单词 EXPLICIT 或 IMPLICIT)对 TBSCertificate 值进行编码/解码

您显示的文本称为规范并描述类型(TBSCertificate)。实际上,这只是规范的一部分,因为您缺少 Version、CerficateSerialNumber 等的定义。

规范是人类可读的文本。

当您想要实例化值时,您必须知道将使用哪种编码(ASN.1 定义了其中的一些,二进制和文本)

最古老的二进制编码称为基本编码规则并使用 TLV 形式。

通常,作为用户,您不需要了解编码的细节。您应该使用从规范创建一些代码的工具。

对我来说,在规范中允许标签是在 ASN.1 开始时犯的一个巨大错误。它混合了 2 个完全不同的东西(规范和编码)。

后来通过所谓的自动标记解决了这个问题,但损坏已经造成。


推荐阅读