Python OpenSSL - 验证CRL文件

3 投票
2 回答
4946 浏览
提问于 2025-04-18 16:59

我们正在使用Python和OpenSSL来读取一个CRL文件,以提取被撤销的证书序列号列表。在解析这个文件之前,我们需要添加一个检查,确保这个CRL是用一个可信的证书导出的。

在命令行中,适用的OpenSSL命令是:

openssl crl -inform DER -in {crlfile} -CAfile {mycacert} -noout

这个命令的输出结果要么是 verify OK,要么是 verify failure

有没有一种更符合Python风格的方法来进行这个验证,而不是去执行命令行脚本呢?

谢谢!

2 个回答

3

有一种更符合Python风格的方法,可以使用pyOpenSSL来实现:

import requests
import OpenSSL

# Donwload and load your CRL
resp = requests.get(CRL_URL)
crl = OpenSSL.crypto.load_crl(OpenSSL.crypto.FILETYPE_ASN1, resp.content)

# Export CRL as a cryptography CRL.
crl_crypto = crl.to_cryptography()

# Load CA CERTIFICATE
ca = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, '-----BEGIN...'.encode())    

# Get CA Public Key as _RSAPublicKey
ca_pub_key = ca.get_pubkey().to_cryptography_key()

# Validate CRL against CA
valid_signature = crl_crypto.is_signature_valid()
2

使用Python来实现这个功能的一种方法是利用subprocess模块。

如果你使用的是Python 2.7以后的版本,你可以调用check_output这个方法,来运行你想要的命令。具体可以参考下面的代码:

import subprocess

# Files to verify
crlfile = r"path\to\crlfile"
mycacert = r"path\to\mycacert"
# Set up args
args = ["openssl", "crl", "-inform", "DER", "-in", crlfile, "-CAfile", mycacert, "-noout"]
# Run the thing
output = subprocess.check_output(args)
verified = True if output.upper() == "VERIFY OK" else False

根据这个请求,这个功能现在在pyOpenSSL中似乎已经可以使用了。

撰写回答