【问题标题】:Parsing X509 extensions with pyasn1使用 pyasn1 解析 X509 扩展
【发布时间】:2015-10-11 17:14:38
【问题描述】:

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

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,它应该已经包含上述修复

【问题讨论】:

    标签: python x509 der pyasn1


    【解决方案1】:

    由于 BasicConstraints 是一个 SEQUENCE 派生,它的最小可能序列化是 SEQUENCE 标记和零长度。然后它的值可能是一个空字符串,正如你所建议的。事实上就是这样:

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

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

    邮件列表错误不相关 - 处于无限编码模式。

    更新

    原来是 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]
    ... )
    

    这基本上将'cA'组件标记为默认值。应用后,您的序列化可以被解码:

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

    再次更新

    上述错误已在 pyasn1-modules 0.0.7 中修复

    【讨论】:

    • 当然,我可以将它解码为一个简单的序列——但这不是问题所在。就像我写的那样 - 我无法将扩展解码为 BasicConstraints 结构。在我的代码 sn-p 中,第一个解码产生一个字符串,第二个解码应该产生 BasicConstraints。第二个解码在没有 asn1Spec=... 的情况下工作,但失败了。
    • 更新了我的回答,误会见谅。
    • 不用担心,很高兴我们到了那里。感谢您守护 StackOverflow Ilya!
    • 请尝试pyasn1-modules 0.0.7
    猜你喜欢
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多