2015-10-15 10 views
0

У меня есть скрипт python, который использовался для генерации сертификатов X509 с расширениями сертификатов с использованием модулей PyASN1 и pyasn1_modules. Но теперь, когда я обновил эти модули до последних версий от pypi (ранее они были из репозиториев Ubuntu 14.04), сгенерированные сертификаты больше не действительны (в соответствии с командой openssl x509, а также командой dumpasn1, которая показывает изменения от ранее созданных сертификатов, значения больше не завертываются в контейнер OctetString).Неверные файлы при создании сертификатов X509, содержащих расширения с более новыми версиями PyASN1

Это проблематично код:

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() 

Каковы изменения в последних версиях, которые могли вызвать это, и как я могу исправить свой код, чтобы сделать его совместимым с новым versio n этих двух модулей (и предпочтительно поддерживать совместимость с предыдущими версиями).

Новые версии: pyasn1 0.1.9 и 0.0.8 pyasn1_modules

версии

Ubuntu Репо: pyasn1 0.1.7 и 0.0.3 pyasn1_modules

Python версии 2.7

ответ

1

Вы, вероятно, следует кодировать контейнер OCTET STRING.

Причина в том, что RFC указывает его как OCTET STRING, но pyasn1-modules используют для него ЛЮБОЙ тип. Поскольку ANY-тип сериализуется прозрачно (например, ни один добавленный тег), вам нужно пройти сериализацию OCTET STRING.

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