ASN.1 语法的“序列”中的数字是什么意思?

What do the numbers within a `sequence` of the ASN.1 syntax mean?

这是一个例子:

 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], ... 是什么意思,什么时候需要它们,没有这样的数字是什么意思?

它们被称为标签号,当使用 TLV(标签长度值)形式(例如 ASN.1基本编码规则)

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

规范是人类可读的文本。

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

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

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

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

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