Python 在PyASN1中创建扩展名为X509的证书时出错

Python 在PyASN1中创建扩展名为X509的证书时出错,python,x509certificate,asn.1,pyasn1,Python,X509certificate,Asn.1,Pyasn1,我正在尝试创建一个X509v3证书,并将其编码到DER中,然后将其保存到一个文件中。我在Ubuntu 14.04上使用PyASN1 0.1.7和Python2.7.6 代码可概括如下: tbs = rfc2459.TBSCertificate() tbs.setComponentByName('XYZ', xyz) # other non-problematic certificate fields .... subjaltname = rfc2459.SubjectAltName() sub

我正在尝试创建一个X509v3证书,并将其编码到DER中,然后将其保存到一个文件中。我在Ubuntu 14.04上使用PyASN1 0.1.7和Python2.7.6

代码可概括如下:

tbs = rfc2459.TBSCertificate()
tbs.setComponentByName('XYZ', xyz)  # other non-problematic certificate fields
....
subjaltname = rfc2459.SubjectAltName()
subjaltname.setComponentByPosition(0, fc2459.GeneralName().setComponentByName('dNSName', 'domain.com'))
extension = rfc2459.Extension()
extension.setComponentByName('extnID', rfc2459.id_ce_subjectAltName)
extension.setComponentByName('critical', univ.Boolean(False))
extension.setComponentByName('extnValue', univ.OctetString(der_encoder.encode(subjaltname)))
extensions = rfc2459.Extensions()
extensions.setComponentByPosition(0, extension)
tbs.setComponentByName('extensions', extensions.subtype(explicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 3)))
cert = rfc2459.Certificate()
cert.setComponentByName('tbsCertificate', tbs)
当我尝试使用DER编码器对
cert
对象进行编码时,出现以下错误:

pyasn1.type.error.ValueConstraintError: ConstraintsIntersection(ConstraintsIntersection(), ValueSizeConstraint(1, 64)) failed at: "ValueSizeConstraint(1, 64) failed at: "Extensions()""
如果您对代码中有问题的部分有任何建议,我们将不胜感激


另外,如果有人有关于如何使用PyASN1创建带有扩展的X509v3证书的工作示例代码,我很想看看。

我猜当您在此处创建扩展对象的子类型时:

tbs.setComponentByName('extensions',extensions.subtype(explicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 3)))
它失去了初始值。您可以尝试将cloneValueFlag=True添加到.subtype()以强制它执行深度复制,或者最好在初始化之前执行子类型:

extensions = rfc2459.Extensions().subtype(explicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 3))
extensions.setComponentByPosition(0, extension)
tbs.setComponentByName('extensions', extensions)

另外,启用pyasn1调试可能有助于故障排除。

谢谢,它解决了问题。但是现在生成了包含扩展的证书,但是openssl无法解析它。我已经更新了这个问题。我通过使用
dumpasn1
分析另一个证书来更正代码。现在效果很好。再次感谢你的图书馆和帮助。@sharklaser我很想看看你的最终解决方案,我遇到了类似的问题。