2

使用 Python 和 PyOpenSSL,有没有办法检索自定义扩展的值?通过自定义扩展,我的意思是使用http://www.openssl.org/docs/apps/x509v3_config.html的任意扩展中描述的任意扩展格式编码的扩展。

此外,是否可以使用 PyOpenSSL 创建包含此类扩展的证书?

如果其中任何一个的答案是“否”,我也会对如何使用任何其他 Python 库执行此操作的指针感兴趣。我不想对 OpenSSL 命令行应用程序执行系统调用。

4

2 回答 2

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 进行编码。这似乎排除了添加任意非字符串扩展数据的可能性。

于 2012-01-15T14:29:10.157 回答
1

获取 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
于 2019-07-24T02:29:05.613 回答