2 つのピア間に暗号化された接続を構築する必要があり、両方を認証する必要があります。両方のピアは、もう一方のピア公開鍵のフィンガープリント (SHA256 ハッシュ) を既に共有しています。X509 または OpenPGP キー/証明書は、私のニーズに対して大きすぎてかさばり、セキュリティ モデルに適合しないため、使用していません。
x509モデルを悪用して、M2Crypto(素敵なライブラリ)との接続を構築しようとしています:
rsa 秘密鍵を指定して、自己署名付きのほとんど空の証明書を作成します。
私の証明書を提供している他のピアに接続します
他のピア証明書の公開鍵のフィンガープリントを確認します。
次のコードは安全ですか? それが正しいか?それをもっとうまくやる方法はありますか(おそらく他のライブラリを使って)?証明書の検証を要求していないため、OpenSSLが実際に認証に証明書の公開鍵を使用していないことに疑問があります。
der-encoded rsa キーによって認証された暗号化されたストリームを使用する必要があるだけです。Python 用のフリー ソフトウェア ソリューションは大歓迎です。私は M2Crypto をもっとよく知っていて、同じプロジェクトで既にいくつかのコードを使用しているので、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()
回答とアドバイスをありがとうございました。