[英]Extract the value of a X.509 certificate custom extension using PyOpenSSL
使用Python和PyOpenSSL,有没有办法检索自定义扩展的值? 所谓自定义扩展,是指使用http://www.openssl.org/docs/apps/x509v3_config.html上 ARBITRARY EXTENSIONS下描述的任意扩展格式编码的扩展。
另外,是否可以使用PyOpenSSL创建包含此类扩展名的证书?
如果对上述任何一个的回答为“否”,那么我也将对如何使用任何其他Python库进行操作的指针感兴趣。 我不想对OpenSSL命令行应用程序执行系统调用。
您可以在使用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自动进行编码。 这似乎排除了添加任意非字符串扩展数据的可能性。
获取X.509证书的任何扩展名,例如get 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.