提取CRL版本属性遇AttributeError错误,寻求解决方法
解决cryptography提取CRL版本时的AttributeError问题
问题原因
你遇到的AttributeError是因为旧版本的cryptography库中,_CertificateRevocationList对象并没有version属性,或是代码缺少必要的模块导入。
解决方案
1. 补全模块导入
确保代码顶部导入x509模块,否则会先触发NameError:
from cryptography import x509 from cryptography.hazmat.backends import default_backend
2. 升级cryptography库
较新版本(3.0+)的cryptography已经为CertificateRevocationList类添加了version属性。运行以下命令升级:
pip install --upgrade cryptography
升级后,你可以直接通过crl.version获取版本枚举对象:
from cryptography import x509 from cryptography.hazmat.backends import default_backend def extract_crl_version(crl_file_path): with open(crl_file_path, "rb") as file: crl_data = file.read() crl = x509.load_der_x509_crl(crl_data, default_backend()) # Version枚举对应关系:v1→CRL版本1,v2→CRL版本2 # 可以通过.value获取ASN.1中的索引值,或直接打印枚举名称 return crl.version.name, crl.version.value crl_file_path = "path/to/crl.crl" version_name, version_value = extract_crl_version(crl_file_path) print(f"CRL Version: {version_name} (ASN.1索引: {version_value})")
注:openssl显示的"Version 2"对应枚举x509.Version.v2,其value为1(ASN.1版本索引从0开始计数)。
3. 无法升级时的替代方案
如果受环境限制不能升级库,可以手动解析ASN.1结构获取版本:
from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives.asn1 import DerSequence def extract_crl_version(crl_file_path): with open(crl_file_path, "rb") as file: crl_data = file.read() crl_seq = DerSequence().from_bytes(crl_data, default_backend()) # CRL的ASN.1结构中,第一个字段是可选的版本索引(缺省为0,对应CRL版本1) if isinstance(crl_seq[0], int): # 索引+1得到人类可读的CRL版本号 crl_version = crl_seq[0] + 1 else: crl_version = 1 return crl_version crl_file_path = "path/to/crl.crl" print("CRL Version:", extract_crl_version(crl_file_path))
内容的提问来源于stack exchange,提问作者Viraj Rathod
相关产品推荐
相关产品推荐

