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 OKverify 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 文件的主要内容,如果未能解决你的问题,请参考以下文章

OpenSSL 现在会自动处理 CRL(证书撤销列表)吗?

联盟链系列 - 用Openssl管理CRL

联盟链系列 - 用Openssl管理CRL

联盟链系列 - 用Openssl管理CRL

为什么X509_CRL_verify()失败?

Openssl crl2pkcs7命令