Python OpenSSL - 验证 CRL 文件
Posted
技术标签:
【中文标题】Python OpenSSL - 验证 CRL 文件【英文标题】:Python OpenSSL - Verifying a CRL File 【发布时间】:2014-08-12 12:12:40 【问题描述】:我们正在使用 Python 和 OpenSSL 读取 CRL 文件以提取已撤销证书序列号的列表。在解析文件之前,我们需要添加一个检查以验证 CRL 是否已使用受信任的证书导出。
在命令行中,适当的 OpenSSL 命令是:
openssl crl -inform DER -in crlfile -CAfile mycacert -noout
输出verify OK
或verify failure
有没有一种 Pythonic 方式来执行此验证,而不必使用命令行脚本?
谢谢
【问题讨论】:
【参考方案1】:使用 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
根据this 拉取请求,此功能现在似乎在pyOpenSSL 中可用。
【讨论】:
谢谢,Noelkid,但这不是我正在寻找的解决方案。 CRL 已经包含在 Python 中的字符串缓冲区中,如果可能的话,我们并不特别希望通过文件系统,因此我们希望直接从 python 调用它,而不是包装原生调用。 我感觉这不是您想要的,将进一步研究。 您好 Noelkd,尽管您的答案与我最初寻找的不完全一样,但我没有找到更好的解决方案,因此我实施并接受了您的答案。 我最终调查了pyOpenSSL 看不到您需要的功能out of the box
。如果其他人有更好的答案,您可以稍后将问题奖励给他们!【参考方案2】:
通过使用 pyOpenSSL,有一种更 Pythonic 的方式来做到这一点:
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()
【讨论】:
以上是关于Python OpenSSL - 验证 CRL 文件的主要内容,如果未能解决你的问题,请参考以下文章