使用pyasn1解析X509扩展

时间:2015-07-22 02:20:59

标签: python x509 der pyasn1

我有一个扩展名,描述如下:

Extension().setComponentByPosition(0, ObjectIdentifier(2.5.29.19))
           .setComponentByPosition(1, Boolean('False'))
           .setComponentByPosition(2, Any(hexValue='04023000'))

因此,基于ID,它是BasicConstraints扩展名。但是,如果我尝试将值解析为扩展本身,则会出现错误:

decoder.decode(decoder.decode(e['extnValue'])[0], rfc2459.BasicConstraints())
# PyAsn1Error: Uninitialized component #0 at BasicConstraints()

该字符串解码为空序列,因此它可以合法地为BasicConstraints - name length可选/缺失,ca为默认值,因此不会在DER中编码。

那我在这里错过了什么?如何将此扩展名解码为BasicConstraints类?

PS。这个问题看起来与issue in mailing list类似,但我使用的是0.1.8应该已经包含上述修复

1 个答案:

答案 0 :(得分:1)

由于BasicConstraints是SEQUENCE衍生物,因此其最小可能的序列化是SEQUENCE标记和零长度。然后它的值可能是一个空字符串,如您所建议的那样。事实上这是怎么回事:

>>> derSerialisation, _ = decode(OctetString(hexValue='04023000'))
>>> derSerialisation.prettyPrint()
'0x3000'
>>> constraint, _ = decode(derSerialisation)
>>> constraint.prettyPrint()
'Sequence:\n'

ANY值是不透明的(无标记),但嵌入式DER序列化本身编码为OCTET STRING。因此,在将其传递给解码器以恢复BasicConstraints之前,请务必从OCTET STRING序列化中提取DER内容。

邮件列表错误无关紧要 - 那是在无限编码模式下。

<强>已更新

原来是rfc2459.BasicConstraints规范中的一个错误。正在准备正式修复/发布时,我可以建议以下猴子补丁到pyasn1_modules.rfc2459:

>>> from pyasn1.type import namedtype
>>> from pyasn1_modules import rfc2459
>>> rfc2459.BasicConstraints.componentType = namedtype.NamedTypes(
...     namedtype.DefaultedNamedType(*rfc2459.BasicConstraints.componentType[0]),
...     rfc2459.BasicConstraints.componentType[1]
... )

基本上标志着&#39; cA&#39;组件默认。应用后,您的序列化可以解码:

>>> s
Any(hexValue='04023000')
>>> basicConstraints, _ = decoder.decode(decoder.decode(s)[0], rfc2459.BasicConstraints())
>>> print(basicConstraints.prettyPrint())
BasicConstraints:
 cA='False'

再次更新

上面的错误已在pyasn1-modules 0.0.7

中修复