Python OpenSSL - 验证CRL文件
我们正在使用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