我想了解x509证书中CDP扩展使用的ASN.1格式。
当从google上阅读证书时,我看到这些代码相关。
30 26 30 24 a0 22 a0 20 86 1e (url start)
根据 http:/rcardon.free.frwebsigndownloadapi-x509-extbecardonasn1x509extensionsCRLDistributionPoints.html。 和 http:/javadoc.iaik.tugraz.asiaik_jcecurrentiaikasn1structuresGeneralNames.html。,GeneralNames应该是GeneralName的SEQUENCE。为什么直接有一个86而没有另一个30?
非常感谢。
更新:而且,我知道它的语法可能不正确,如果只有一个DistributionPoint,有一个DistributionPointName-Url(*1),DistributionPointName-nameRelativeToCRLIssuer(*2),一个全部为0的原因(*3),和两个cRLIssuer-DNSName(*4和*5),那么这个数据包应该是。
30 len --DistributionPoint
a0 len --DistributionPointName for distributionPoint
a0 len --GeneralNames for fullName
86 len --IA5String for uniformResourceIdentifier
(*1) data here
a1 len --RelativeDistinguishedName for nameRelativeToCRLIssuer (edited)
(*2) data here
81 03 --Reason
07 00 00 --BITSTRING of Reason (*3)
a2 len --GeneralNames for cRLIssuer
82 len --IA5String for dNSName
(*4) data here
82 len --IA5String for dNSName
(*5) data here
我说的对吗?
你有没有尝试分析提供的八位数?你要求丢失的SEQUENCE,但不要求额外的 a0
兜售 86
标签。如果你愿意,你可以弄清楚是怎么回事。
你的CDP扩展值的二进制编码看起来没问题。0x86是一般名称CHOICE的 uniformResourceLocator
字段。如果您将二进制字符串拆分成几块,您将得到以下映射(假设隐式标记模式,根据 RFC 5280)。
CRLDistributionPoints
DistributionPoint
DistributionPointName
(它是OPTIONAL字段,因此使用隐性标签)GeneralNames
(它是一个CHOICE值,因此使用隐性标签)uniformResourceIdentifier
领域 IA5String
类型。是CHOICE值,这个使用的是隐性标签。看来你是把标签搞混了。GeneralName
type确实是 SEQUENCE
但在给定的上下文中,它是在CHOICE中使用的,所以它被隐式标记。SEQUENCE标签被替换为相应的 CONTEXT_SPECIFIC
标签[0]。
更新:当ASN模块中包含CHOICE、OPTIONAL、DEFAULT关键字时,它们使用的是CONTEXT_SPECIFIC类,其基本标签号为0x80。
当 ASN 模块包含 CHOICE、OPTIONAL、DEFAULT 关键字时,它们使用 CONTEXT_SPECIFIC 类,该类的基本标签号为 0x80。选择符被指定在方括号内。在这些情况下,你可以这样做(当模块默认使用隐式标签时,就像在我们的例子中)。CONTEXT_SPECIFIC class (0x80) + CONSTRUCTED BIT (0x32) from original type + Selector number in square bra括号。
例如,带有选择器0的可选SEQUENCE将导致0x80 + 0x20 + 0 = 0xa0。选择[6]IA5String将导致0x80 + 0x0(CONSTRUCTED位为0)+0x6 = 0x86。
当模块默认为显式标记或有EXPLICIT keywor时,那么原始类型不会改变(SEQUENCE仍为SEQUENCE),而是将其编码为CONSTRUCTED CONTEXT_SPECIFIC的嵌套类型。