使用PyOpenSSL提取X.509证书自定义扩展的值

2 投票
2 回答
13195 浏览
提问于 2025-04-17 01:11

使用Python和PyOpenSSL,有没有办法获取自定义扩展的值?这里的自定义扩展是指按照ARBITRARY EXTENSIONS中描述的任意扩展格式编码的扩展,具体可以参考这个链接

另外,使用PyOpenSSL是否可以创建一个包含这样的扩展的证书?

如果这两个问题的答案都是“否”,我也希望能得到一些建议,告诉我用其他Python库怎么做。我不想调用OpenSSL命令行工具。

2 个回答

2

获取X.509证书上的任何扩展,比如获取subjectAltName(主题备用名称):

cert = crypto.load_certificate(crypto.FILETYPE_ASN1, open(certName).read()) 
for index in range(cert.get_extension_count()):                                                                                                                                                         
        ext = cert.get_extension(index)                                                                                                                                                                          
        if 'subjectAltName' == ext.get_short_name():                                                                                                    
            print(str(ext))
        else:
            pass
9

你可以使用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进行编码。这似乎意味着你不能随便添加非字符串类型的扩展数据。

撰写回答