如何在python中验证X509证书并进行CRL检查?

5 投票
3 回答
3476 浏览
提问于 2025-04-17 03:42

我正在尝试用Python验证一个X509证书。具体来说,我需要在验证时检查CRL(证书吊销列表)。

现在,你可以使用m2crypto来完成这个任务,但我找不到与openssl的-crl_check或-crl_check_all相对应的选项。

另外,我可以使用管道直接调用openssl:

p1 = Popen(["openssl", "verify", "-CApath", capath, "-crl_check_all"], 
           stdin = PIPE, stdout = PIPE, stderr = PIPE)

message, error = p1.communicate(certificate)
exit_code = p1.returncode

不过,似乎openssl verify总是返回一个退出代码0,所以我必须以某种方式比较字符串来判断验证是否成功,这样我就不太想这样做了。

我是不是漏掉了什么简单的东西?

谢谢。

3 个回答

0

查看openssl的verify.c源代码,确实发现它总是返回0,而且没有办法改变这个行为。不过,你不需要在命令行上调用openssl:这个库有Python的接口可以使用。

1

我提交了一个补丁给M2Crypto,这个补丁可以让我们验证X509证书,支持通过一系列的CA(证书颁发机构)以及多个CRL(证书撤销列表)来进行验证。

https://bugzilla.osafoundation.org/show_bug.cgi?id=12954#c2

想了解更多信息,可以查看这个帖子: 我该如何在非SSL环境中使用m2crypto来验证X509证书链

1

好的,我做的事情是这样的:

p1 = Popen(["openssl", "verify", "-CApath", capath, "-crl_check_all"], 
           stdin = PIPE, stdout = PIPE, stderr = PIPE)

message, error = p1.communicate(certificate)

verified = ("OK" in message and not "error" in message)

这不是我最初想要的选择。虽然它通过了我的测试,但我不确定它是否总是能正常工作。我对C语言不够了解,无法阅读openssl的源代码来确认它的正确性。

如果有人能找到这个方法可能出错的情况,请留言告诉我。

撰写回答