在 PyASN1 中创建带有扩展名的 X509 证书时出错
Error while creating an X509 certificate with extensions in PyASN1
我正在尝试创建一个 X509v3 证书并将其编码为 DER 并将其保存到一个文件中。我在 Ubuntu 14.04.
上使用 PyASN1 0.1.7 和 Python 2.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()""
如果您对有问题的代码部分提出任何建议,我们将不胜感激。
P.S。如果有人有关于如何使用 PyASN1 创建带有扩展的 X509v3 证书的工作示例代码,我很乐意看到它。
我的猜测是,当您在此处创建 Extensions 对象的子类型时:
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 调试可能有助于故障排除。
我正在尝试创建一个 X509v3 证书并将其编码为 DER 并将其保存到一个文件中。我在 Ubuntu 14.04.
上使用 PyASN1 0.1.7 和 Python 2.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()""
如果您对有问题的代码部分提出任何建议,我们将不胜感激。
P.S。如果有人有关于如何使用 PyASN1 创建带有扩展的 X509v3 证书的工作示例代码,我很乐意看到它。
我的猜测是,当您在此处创建 Extensions 对象的子类型时:
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 调试可能有助于故障排除。