将证书吊销列表 (CRL) 文件从 .crl 转换为 .pem 扩展名 - Python 3

Posted

技术标签:

【中文标题】将证书吊销列表 (CRL) 文件从 .crl 转换为 .pem 扩展名 - Python 3【英文标题】:Converting a Certificate Revocation List (CRL) file from .crl to .pem extension - Python 3 【发布时间】:2019-01-11 20:46:34 【问题描述】:

我正在开发一个 Python 3.4 应用程序组件,用于检查 URL 的证书是否存在于其 CA 提供的 CRL 中。我正在使用加密包来加载证书以及 CRL。下面是部分代码;

from cryptography import x509  
from cryptography.hazmat.backends import default_backend
from cryptography.x509.oid import ExtensionOID
from cryptography.x509.oid import NameOID
import urllib.request

URL = "www.xxx.com"
cert_str = ssl.get_server_certificate((URL,443))
pem_data = cert_str.encode()  
cert = x509.load_pem_x509_certificate(pem_data, default_backend())
crlDistrPoints = cert.extensions.get_extension_for_oid(ExtensionOID.CRL_DISTRIBUTION_POINTS)
crlURL = crlDistrPoints.value.full_name[0].value 
crlFile = "/path...." 
urllib.request.urlretrieve(crlURL,crlFile) # downloading a .crl file and save as crlFile
# Need to convert a crlFile to PEM format for pem_crl_data below
crl = x509.load_pem_x509_crl(pem_crl_data, default_backend())

代码从站点“crlURL”下载一个 CRL 文件,并将其作为 crlFile 存储在本地。该文件具有 .crl 扩展名。该文件必须转换为 PEM 格式(并分配给 pem_crl_data)才能获得 crl 对象“crl”。如何进行转换(甚至不将文件保存在本地)?

【问题讨论】:

【参考方案1】:

使用 pyOpenSSL 中的加密模块:

from OpenSSL import crypto

然后使用这段代码:

with open(crlFile, "rb") as in_file:    
    crl_obj = crypto.load_crl(crypto.FILETYPE_ASN1, in_file.read())
    pem_crl_data = crypto.dump_crl(crypto.FILETYPE_PEM, crl_obj)

【讨论】:

以上是关于将证书吊销列表 (CRL) 文件从 .crl 转换为 .pem 扩展名 - Python 3的主要内容,如果未能解决你的问题,请参考以下文章

Go-加密学 - 证书吊销列表(CRL)

Go-加密学 - 证书吊销列表(CRL)

如何对 PDF 中的证书吊销列表 (CRL) 流字节进行编码?

联盟链系列 - 用Openssl管理CRL

联盟链系列 - 用Openssl管理CRL

如何在使用本地 CRL 文件(C#)的验证过程中检查客户端证书吊销