2011-09-02 52 views
2

使用Python和PyOpenSSL,有沒有辦法檢索自定義擴展的值?通過自定義擴展,我的意思是使用在http://www.openssl.org/docs/apps/x509v3_config.html的ARBITRARY EXTENSIONS下描述的任意擴展格式編碼的擴展。使用PyOpenSSL提取X.509證書自定義擴展的值

另外,是否有可能使用PyOpenSSL創建包含這樣的擴展名的證書?

如果對其中任何一個的答案都是「否」,我也會對如何在任何其他Python庫中執行此操作的指針感興趣。我不想對OpenSSL命令行應用程序執行系統調用。

回答

6

您可以獲得使用pyOpenSSL加載的X.509證書上的任何擴展。例如:

>>> 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進行編碼。這似乎排除了添加任意非字符串擴展數據的可能性。

+0

任何合適的方式來解碼擴展的原始數據? –

+0

最近的'asn1crypto'庫可能對此有用。 –

+0

好的,謝謝你的回覆 –