0

我有一个 python 脚本,用于使用 PyASN1 和pyasn1_modules模块生成带有证书扩展的 X509 证书。但是现在我已经将这些模块更新到 pypi 的最新版本(以前它们来自 Ubuntu 14.04 repos),生成的证书不再有效(根据openssl x509命令和dumpasn1显示先前生成的证书的更改的命令,特别是扩展值是不再包装在OctetString容器中)。

这是有问题的代码:

from pyasn1.type import univ
from pyasn1.codec.der import encoder as der_encoder
from pyasn1_modules import rfc2459

extn = rfc2459.BasicConstraints()
extn.setComponentByName('cA', True)
extn.setComponentByName('pathLenConstraint', 5)

extn_val = der_encoder.encode(extn)
extension = rfc2459.Extension()
extension.setComponentByName('extnID', '2.5.29.19')
extension.setComponentByName('critical', True)
extension.setComponentByName('extnValue', extn_val)

我尝试将最后一行更改为:

extension.setComponentByName('extnValue', univ.OctetString(extn_val))

这从 PyASN1 引发了这个错误:

Component value is tag-incompatible: OctetString(hexValue='30060101ff020105') vs Any()

最近版本中可能导致此问题的更改是什么,以及如何更正我的代码以使其与这两个模块的新版本兼容(并最好使其与以前的版本兼容)。

新版本:pyasn1 0.1.9 和 pyasn1_modules 0.0.8

Ubuntu 存储库版本:pyasn1 0.1.7 和 pyasn1_modules 0.0.3

Python 2.7 版

4

1 回答 1

1

您可能还应该对 OCTET STRING 容器进行编码。

原因是 RFC 将其指定为 OCTET STRING,但 pyasn1-modules 使用 ANY 类型。由于 ANY 类型是透明序列化的(例如没有添加标签),因此您需要通过 OCTET STRING 序列化。

extension.setComponentByName('extnValue', der_encoder.encode(univ.OctetString(extn_val)))
于 2015-10-19T06:24:40.510 回答