m2crypto自定义证书验证
我需要在两个对等方之间建立一个加密连接,并且需要对双方进行身份验证。两个对等方已经共享了对方公钥的指纹(SHA256哈希值)。我不打算使用X509或OpenPGP的密钥/证书,因为它们太大了,不适合我的需求,也不符合我的安全模型。
我正在尝试使用M2Crypto(一个很不错的库)来建立连接,利用它的x509模型:
给定rsa私钥,创建一个几乎空的自签名证书。
连接到另一个对等方,并提供我的证书。
验证对方证书的公钥指纹。
下面的代码安全吗?正确吗?有没有更好的方法(也许可以用其他库)?我对OpenSSL是否真的使用证书公钥进行身份验证有疑问,因为我并没有请求对证书进行任何验证。
我只需要使用由der编码的rsa密钥进行身份验证的加密流,任何免费的Python解决方案都欢迎。我更喜欢M2Crypto,因为我对它比较熟悉,并且在同一个项目中已经有一些使用它的代码。
这是我的代码(只是客户端,对应的服务器应该类似):
other_fingerprints = [] #list of fingerprints, (binary data)
mysocket = ... #any socket object
CERTFILE, KEYFILE = "testcert","testkey" # private key wrapped in the cert
from M2Crypto import *
ctx = SSL.Context('sslv3')
ctx.set_verify(SSL.verify_none, depth=1)
ctx.load_cert(CERTFILE, KEYFILE)
c = SSL.Connection(ctx, mysocket)
c.connect_ssl()
peercert = c.get_peer_cert()
keyobj = peercert.get_pubkey()
keydata = keyobj.as_der()
md = EVP.MessageDigest('sha256')
md.update(keydata)
h = md.digest()
if h not in other_fingerprints:
raise(IOError) #other party not auth'ed
# from now on the connection is secure, right?
c.send("Hello secret world!")
print c.recv(4096)
c.close()
谢谢大家的回答和建议。
2 个回答
-2
答案其实就在问题里:使用合适的x509证书,并进行对称的验证。“这样安全吗?” - 不安全,因为你还在问。
你的解决方案可能能用,但你问“这样安全吗?”这说明你可能应该直接使用现成的东西。
0
看起来你的方法应该是可行的,但其实已经有一个内置的指纹检查工具,你可以试试。可以参考这里:在制作OpenSSL密钥时,commonName应该填什么?