我需要在兩個對等端之間建立加密連接,並且我需要對兩者進行身份驗證。 兩個對等端已經共享另一個對等公鑰的指紋(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()
謝謝大家提前爲您解答和建議。
謝謝。這是我需要知道的一切! 無論如何,我正在考慮使用SSL.Checker作爲優雅,但我不知道X509「指紋」是否已經是DER密鑰的摘要,還是它是完整證書(包括密鑰和字段)的摘要?因爲我可能從裸密鑰生成證書,所以我擔心OpenSSL中的細微變化可能會產生不同的指紋並破壞事物。 如果是這樣,那麼做自己的Checker類還是繼承它?它被認爲是優雅還是相當黑客? – Kiwi 2010-01-30 01:21:37
在SSL.Checker中,指紋意味着採用DER格式的整個證書的哈希值。我相信這與openssl x509 -fingerprint所做的一樣。如果您以不同的方式計算指紋,您當然可以自由編寫自己的檢查程序。 – 2010-01-30 03:12:03