我试图理解x509证书中CDP扩展中使用的ASN.1格式。
在从google读取证书时,我看到以下代码:
30 26 30 24 a0 22 a0 20 86 1e (url start)
根据http://rcardon.free.fr/websign/download/api-x509-ext/be/cardon/asn1/x509/extensions/CRLDistributionPoints.html和http://javadoc.iaik.tugraz.at/iaik_jce/current/iaik/asn1/structures/GeneralNames.html的说法,GeneralNames应该是GeneralName的序列。为什么有一个86直接没有另一个30?
非常感谢。
更新:而且,我知道语法上可能不正确,如果只有一个带有一个DistributionPointName-Url(*1)的DistributionPoint (*1),DistributionPoint是所有0(*3)和2 cRLIssuer(*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我说的对吗?
发布于 2020-05-15 11:36:44
你试过分析提供的八位数吗?您要求缺少序列,但不要要求在a0标记周围添加额外的86标记。如果你愿意的话,你可以弄清楚到底是怎么回事。
CDP扩展值的二进制编码看起来没问题。0x86是uniformResourceLocator字段的通用名称选择。如果将二进制字符串拆分为几个部分,您将得到以下映射(假定隐式标记模式,如RFC 5280所示):
映射到CRLDistributionPoints
DistributionPoint
DistributionPointName (它是可选字段,因此使用隐式标记)
GeneralNames (这是一个选择值,因此使用隐式标记)
IA5String类型的uniformResourceIdentifier字段。它是选择值,它使用隐式标记.。
似乎你和标签混淆了。GeneralName类型确实是SEQUENCE,但是在给定的上下文中它是在选择中使用的,因此它被隐式标记: SEQUENCE标记被替换为相应的CONTEXT_SPECIFIC标记。
更新:
当ASN模块包含选择、可选、默认关键字时,它们使用的是具有基本标记号0x80的CONTEXT_SPECIFIC类。选择器在方括号中指定。在这些情况下,您可以这样做(当模块默认为隐式标记时,就像我们的例子中那样):CONTEXT_SPECIFIC类(0x80) +从原始类型+选择器号(0x32)构造的位(0x32)放在方括号中。
例如,带有选择器0的可选序列将导致0x80 + 0x20 +0= 0xa0。选择6 IA5String将导致0x80 + 0x0 (构造位为0) + 0x6 = 0x86。
当模块默认为显式标记或有显式keywor时,原始类型不变(序列保持序列),而是将其编码为构造的CONTEXT_SPECIFIC的嵌套类型。
https://stackoverflow.com/questions/61817332
复制相似问题