Извлеките значение пользовательского расширения сертификата X.509, используя PyOpenSSL - PullRequest
2 голосов
/ 02 сентября 2011

Используя Python и PyOpenSSL, есть ли способ получить значение пользовательского расширения?Под пользовательским расширением я подразумеваю расширение, закодированное с использованием произвольного формата расширения, описанного в разделе ARBITRARY EXTENSIONS в http://www.openssl.org/docs/apps/x509v3_config.html.

. Также возможно ли создать сертификат, содержащий такое расширение, с использованием PyOpenSSL?

Если ответом на любой из них является «нет», мне также будут интересны указатели о том, как это сделать с любой другой библиотекой Python.Я не хочу выполнять системные вызовы приложения командной строки OpenSSL.

1 Ответ

7 голосов
/ 15 января 2012

Вы можете получить любое и все расширения в сертификате X.509, который вы загрузили с помощью pyOpenSSL.Например:

>>> from OpenSSL import crypto as c
>>> cert = c.load_certificate(c.FILETYPE_PEM, file('server.pem').read())
>>> cert.get_extension_count()
4L
>>> ext = cert.get_extension(0)
>>> ext.get_short_name()
'basicConstraints'
>>> ext.get_data()
'0\x00'
>>> 

Данные выводятся в необработанном формате (некоторая кодировка ASN.1, возможно, в зависимости от конкретного расширения).

Вы также можете добавить расширения.

>>> newext = c.X509Extension('nsComment', 0, 'tacos are delicious')
>>> cert.add_extensions([newext])
>>> cert.get_extension_count()
5L
>>> cert.get_extension(4)
<X509Extension object at 0x7f74db7c2290>
>>> cert.get_extension(4).get_data()
'\x16\x13tacos are delicious'
>>> 

Однако обратите внимание на небольшую асимметрию.Данные расширения должны быть строкой и автоматически кодироваться с использованием ASN.1.Похоже, это исключает возможность добавления произвольных нестроковых данных расширения.

...