1

我需要在两个对等方之间建立加密连接,并且我需要对两者进行身份验证。两个对等点已经共享另一个对等点公钥的指纹(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()

提前感谢大家的回答和建议。

4

2 回答 2

0

看来您的方法应该可行,但是您可能已经可以使用内置的指纹检查器。请参阅此处:制作 OpenSSL 密钥时为 commonName 放置什么?

于 2010-01-29T18:00:14.020 回答
-2

答案就在问题中:使用正确的 x509 证书,并对称地验证/验证。“这安全吗?” - 不,因为你必须问。

您的解决方案可能有效,但事实上您正在就“这安全吗?”寻求建议。告诉我你应该直接使用盒子里的东西。

于 2010-01-29T08:58:48.493 回答