m2crypto自定义证书验证

1 投票
2 回答
2099 浏览
提问于 2025-04-15 18:37

我需要在两个对等方之间建立一个加密连接,并且需要对双方进行身份验证。两个对等方已经共享了对方公钥的指纹(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应该填什么?

撰写回答