创建包含更新版本PyASN1扩展名的X509证书时,文件无效

2024-10-01 09:22:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python脚本,用于使用PyASN1和pyasn1_modules模块生成具有证书扩展的X509证书。但是现在我已经将这些模块更新到pypi的最新版本(以前它们来自ubuntu14.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)

我试着把最后一行改成这样:

^{pr2}$

这将从PyASN1引发此错误:

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

最近版本中的哪些更改可能会导致此问题?我如何更正代码以使其与这两个模块的新版本兼容(最好保持与以前版本的兼容)。在

新版本:pyasn1 0.1.9和pyasn1_模块0.0.8

Ubuntu repo版本:pyasn1 0.1.7和pyasn1_模块0.0.3

Python 2.7版


Tags: 模块fromimport命令版本modulesencoderextension
1条回答
网友
1楼 · 发布于 2024-10-01 09:22:24

您可能也应该对octetstring容器进行编码。在

原因是RFC将其指定为八位字节字符串,但pyasn1模块使用任何类型的字符串。由于任何类型都是透明序列化的(例如没有添加标记),所以您需要传递八位字节字符串序列化。在

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

相关问题 更多 >