我需要验证证书是否由我的自定义 CA 签名。使用 OpenSSL 命令行实用程序很容易做到这一点:
# Custom CA file: ca-cert.pem
# Cert signed by above CA: bob.cert
$ openssl verify -CAfile test-ca-cert.pem bob.cert
bob.cert: OK
但是我需要在 Python 中做同样的事情,而且我真的不想调用命令行实用程序。据我所知,M2Crypto 是 OpenSSL 的“最完整”的 python 包装器,但我不知道如何完成命令行实用程序的功能!
参考这个问题以了解如何在 C 代码中完成相同的任务,我已经完成了大约一半。 我选择的变量名称与 openssl verify 命令行实用程序的源代码中使用的变量名称相同,请参阅openssl-xxx/apps/verify.c
.
import M2Crypto as m2
# Load the certificates
cacert = m2.X509.load_cert('test-ca-cert.pem') # Create cert object from CA cert file
bobcert = m2.X509.load_cert('bob.cert') # Create cert object from Bob's cert file
cert_ctx = m2.X509.X509_Store() # Step 1 from referenced C code steps
csc = m2.X509.X509_Store_Context(cert_ctx) # Step 2 & 5
cert_ctx.add_cert(cacert) # Step 3
cert_ctx.add_cert(bobcert) # ditto
# Skip step 4 (no CRLs to add)
# Step 5 is combined with step 2...I think. (X509_STORE_CTX_init: Python creates and
# initialises an object in the same step)
# Skip step 6? (can't find anything corresponding to
# X509_STORE_CTX_set_purpose, not sure if we need to anyway???)
#
# It all falls apart at this point, as steps 7 and 8 don't have any corresponding
# functions in M2Crypto -- I even grepped the entire source code of M2Crypto, and
# neither of the following functions are present in it:
# Step 7: X509_STORE_CTX_set_cert - Tell the context which certificate to validate.
# Step 8: X509_verify_cert - Finally, validate it
所以我已经完成了一半,但我似乎无法真正完成验证!我错过了什么吗?我应该从 M2Crypto 使用其他功能吗?我应该寻找一个完全不同的 OpenSSL python 包装器吗?我怎样才能在 python 中完成这个任务!?!?
请注意,我使用证书来加密/解密文件,所以我对使用基于 SSL 连接的对等证书验证(已经回答)不感兴趣,因为我没有任何 SSL 连接。