Неверные файлы при создании сертификатов X509, содержащих расширения с более новыми версиями PyASN1
У меня есть сценарий Python, который используется для создания сертификатов X509 с расширениями сертификатов с использованием PyASN1 и pyasn1_modules
модули. Но теперь, когда я обновил эти модули до последних версий из pypi (ранее они были из репозиториев Ubuntu 14.04), сгенерированные сертификаты больше не действительны (согласно 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: pyasn1 0.1.7 и pyasn1_modules 0.0.3
Python версия 2.7
1 ответ
Возможно, вам следует также закодировать контейнер OCTET STRING.
Причина в том, что RFC определяет его как OCTET STRING, но pyasn1-модули используют для него ЛЮБОЙ тип. Поскольку ЛЮБОЙ тип сериализуется прозрачно (например, тег не добавлен), вам необходимо пройти сериализацию OCTET STRING.
extension.setComponentByName('extnValue', der_encoder.encode(univ.OctetString(extn_val)))