如何解析Python cryptography库x509证书的KeyUsage扩展
问题解答
1. KeyUsage对象的类型说明
你拿到的KeyUsage.value就是cryptography.x509.extensions.KeyUsage类的实例,这是cryptography库专门封装X509证书密钥用法扩展的强类型类,对应RFC5280标准定义的9种密钥用法,每个用法的启用状态都以布尔属性的形式存在于实例中。
你之前误以为它是可迭代对象,大概率是混淆了证书扩展集合的属性和单个扩展实例的属性:证书的extensions集合本身是可迭代的,可以遍历所有扩展,但单个KeyUsage实例是固定属性的强类型对象,不是可迭代序列。
2. 转换为dict的实现方法
KeyUsage类没有内置转字典的方法,你可以用以下两种方式实现转换:
手动映射(推荐)
因为KeyUsage的属性是固定不变的,手动映射的稳定性最高,不会受库版本迭代影响:
from cryptography.x509 import ExtensionOID # 获取KeyUsage扩展实例 key_usage_ext = certDecoded.extensions.get_extension_for_oid(ExtensionOID.KEY_USAGE) key_usage = key_usage_ext.value # 构造字典 key_usage_dict = { "digital_signature": key_usage.digital_signature, "content_commitment": key_usage.content_commitment, "key_encipherment": key_usage.key_encipherment, "data_encipherment": key_usage.data_encipherment, "key_agreement": key_usage.key_agreement, "key_cert_sign": key_usage.key_cert_sign, "crl_sign": key_usage.crl_sign, "encipher_only": key_usage.encipher_only, "decipher_only": key_usage.decipher_only }
通用自动转换
如果不想手动写全所有属性,可以用内置属性过滤实现:
key_usage_dict = {k: v for k, v in key_usage.__dict__.items() if not k.startswith('_')}
内容的提问来源于stack exchange,提问作者network_slayer
相关产品推荐
相关产品推荐

