我需要在两个对等方之间建立加密连接,并且我需要对两者进行身份验证。两个对等点已经共享另一个对等点公钥的指纹(SHA256 哈希)。我没有使用 X509 或 OpenPGP 密钥/证书,因为它们对于我的需要来说太大而笨重,而且它们不适合安全模型。
我正在尝试通过滥用其 x509 模型与 M2Crypto (不错的库)建立连接:
给定 rsa 私钥,创建一个自签名的几乎为空的证书。
连接到提供我的证书的其他对等方
验证其他对等证书公钥指纹;
下面的代码安全吗?这是正确的吗?有没有办法做得更好(也许与其他图书馆)?我怀疑 OpenSSL 实际上没有使用证书公钥进行身份验证,因为我没有要求对证书进行任何验证。
我只需要使用由 der-encoded 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()
提前感谢大家的回答和建议。