Nat*_*han 13 python ssl openssl m2crypto x509certificate
我需要验证证书是否由我的自定义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
Run Code Online (Sandbox Code Playgroud)
但是我需要在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
Run Code Online (Sandbox Code Playgroud)
所以我在那里,但我似乎无法真正完成验证!我错过了什么吗?我应该从M2Crypto使用其他功能吗?我应该寻找一个完全不同的OpenSSL python包装器吗?我怎样才能在python中完成这个任务!?!?
请注意,我正在使用证书来加密/解密FILES,因此我对使用基于SSL连接的对等证书验证(已经得到解答)不感兴趣,因为我没有任何SSL连接.
你不能用普通的M2Crypto做到这一点,因为它没有包含一些必需的功能.好消息是,如果你安装了SWIG,你可以自己包装并使用M2Crypto代码.我不久前为自己制作了一个带有一些额外功能的模块,并决定现在发布它,因为它进行了这种验证.你可以在这里查看:https://github.com/abbot/m2ext.这是如何使用此模块验证证书的示例:
import sys
from m2ext import SSL
from M2Crypto import X509
print "Validating certificate %s using CApath %s" % (sys.argv[1], sys.argv[2])
cert = X509.load_cert(sys.argv[1])
ctx = SSL.Context()
ctx.load_verify_locations(capath=sys.argv[2])
if ctx.validate_certificate(cert):
print "valid"
else:
print "invalid"
Run Code Online (Sandbox Code Playgroud)
不幸的是,M2Crypto开发似乎停滞不前(过去两年中bug跟踪器没有封闭的问题),维护者忽略了我的错误和电子邮件以及这些和其他一些补丁......
小智 -3
正如你所说,OpenSSL 需要连接
M2Crypto 没有很好的验证
这个巧妙的想法怎么样:
import os
os.system('openssl verify -CAfile ../ca-cert.pem bob.cert')
Run Code Online (Sandbox Code Playgroud)
它丑陋,但它有效!
| 归档时间: |
|
| 查看次数: |
17702 次 |
| 最近记录: |