1

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()

回答とアドバイスをありがとうございました。

4

2 に答える 2

0

あなたのアプローチは機能するはずですが、使用できる組み込みの指紋チェッカーが既にあります。ここを参照してください: OpenSSL キーを作成するときに commonName に何を入力しますか?

于 2010-01-29T18:00:14.020 に答える
-2

答えは問題にあります: 適切な x509 証明書を使用し、対称的に検証/検証します。「これは安全ですか?」-いいえ、あなたが尋ねなければならないからです。

あなたのソリューションはうまくいくかもしれませんが、「これは安全ですか?」というアドバイスを求めているという事実。おそらく箱から出してすぐに使うべきだと言っています。

于 2010-01-29T08:58:48.493 に答える