Ошибка при создании сертификата X509 с расширениями в PyASN1

Я пытаюсь создать сертификат X509v3, кодировать его в DER и сохранить в файл. Я использую PyASN1 0.1.7 и Python 2.7.6 в Ubuntu 14.04.

Код можно резюмировать так:

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)

Когда я пытаюсь кодировать cert объект с кодировщиком DER, я получаю эту ошибку:

pyasn1.type.error.ValueConstraintError: ConstraintsIntersection(ConstraintsIntersection(), ValueSizeConstraint(1, 64)) failed at: "ValueSizeConstraint(1, 64) failed at: "Extensions()""

Будем благодарны за любые предложения по проблемной части кода.

PS Если у кого-нибудь есть рабочий пример кода о том, как создать сертификат X509v3 с расширениями, использующими PyASN1, я бы хотел его увидеть.

1 ответ

Решение

Я предполагаю, что когда вы делаете подтип объекта 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 может быть полезно для устранения неполадок.

Другие вопросы по тегам