我需要在两个对等体之间建立加密连接,我需要对两者进行身份验证。 两个对等体已经共享另一个对等公钥的指纹(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()
提前感谢大家的答案和建议。
答案 0 :(得分:0)
看起来您的方法应该可行,但是您已经可以使用内置的指纹检查程序。见这里:What to put for a commonName when making an OpenSSL key?
答案 1 :(得分:-2)
答案在于问题:使用适当的x509证书,并对称地验证/验证。 “这安全吗?” - 不,因为你不得不问。
您的解决方案可能有效,但事实上您正在征求“这是否安全?”的建议。告诉我你应该直接从盒子里拿东西。