2010-01-29 70 views
1

我需要在两个对等端之间建立加密连接,并且我需要对两者进行身份验证。 两个对等端已经共享另一个对等公钥的指纹(SHA256散列)。 我没有使用X509或OpenPGP密钥/证书,因为它们对于我的需求来说太大且笨重,并且它们不适合安全模型。m2crypto定制证书验证

我试图通过滥用其X509模型建立与M2Crypto(好的库)的连接:

  • 给出的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() 

谢谢大家提前为您解答和建议。

回答

0

看来你的方法应该可行,但已经有了一个你可以使用的内置指纹检查器。看到这里:What to put for a commonName when making an OpenSSL key?

+0

谢谢。这是我需要知道的一切! 无论如何,我正在考虑使用SSL.Checker作为优雅,但我不知道X509“指纹”是否已经是DER密钥的摘要,还是它是完整证书(包括密钥和字段)的摘要?因为我可能从裸密钥生成证书,所以我担心OpenSSL中的细微变化可能会产生不同的指纹并破坏事物。 如果是这样,那么做自己的Checker类还是继承它?它被认为是优雅还是相当黑客? – Kiwi 2010-01-30 01:21:37

+0

在SSL.Checker中,指纹意味着采用DER格式的整个证书的哈希值。我相信这与openssl x509 -fingerprint所做的一样。如果您以不同的方式计算指纹,您当然可以自由编写自己的检查程序。 – 2010-01-30 03:12:03

-2

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

您的解决方案可能会正常工作,但是您要求提供“这是否安全?”的建议?告诉我你应该直接从盒子里使用东西。

+0

我对这个理论非常有信心,我不确定的是me2crypto(和openssl)中的代码。我唯一担心的是openssl在握手过程中使用或不使用证书中的公钥。如果我能分发我甚至不会问的证书。在这种情况下没有“适当”的方式来使用X509。 M2Crypto具有执行自定义检查的功能,SSL.Context.set_verify(,, callback()),但我没有找到任何文档。 – Kiwi 2010-01-29 10:51:46