创建包含具有较新版本PyASN1的扩展名的X509证书时出现无效文件

时间:2015-10-15 15:13:45

标签: python x509 asn.1 pyasn1

我有一个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 repo版本:pyasn1 0.1.7和pyasn1_modules 0.0.3

Python 2.7版

1 个答案:

答案 0 :(得分:1)

您也应该对OCTET STRING容器进行编码。

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

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