2010-01-29 74 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