0

次のように説明されている拡張機能があります。

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 lengthcaあるため、DER でエンコードされません。

それで、私はここで何が欠けていますか?BasicConstraintsこの拡張機能をクラスにデコードするにはどうすればよいですか?

PS。この問題はメーリング リストの問題に似ているようですが、私は 0.1.8 を使用しており、これには前述の修正が既に含まれているはずです。

4

1 に答える 1

1

BasicConstraints は SEQUENCE の派生物であるため、可能な最小のシリアライゼーションは SEQUENCE タグと長さ 0 です。あなたが提案したように、その値は空の文字列になる可能性があります。そして、これは実際には次のとおりです。

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

ANY 値は不透明 (タグなし) ですが、埋め込まれた DER シリアライゼーション自体は OCTET STRING としてエンコードされます。したがって、DER コンテンツを OCTET STRING シリアライゼーションから抽出してから、それをデコーダーに渡して 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で修正されています。

于 2015-07-22T06:11:12.017 に答える