1

ネットワーク上の名前のないホスト間でピアツーピア方式で動作するアプリケーションアプリケーションフレームワークがあります。トラフィックを暗号化したいので、M2Cryptoを使用してセットアップを実装しましたが、問題が発生しました。証明書を作成するときに「commonName」に何を入力すればよいかわかりません。ドメイン名が必要なようですが、これを実行しているコンピュータにはドメイン名がありません。commonNameに「temphost」を付けただけですが、これは明らかに重要なパラメーターです。私はそれをテストしようとしたときにこれを手に入れました:

M2Crypto.SSL.Checker.WrongHost:ピア証明書commonNameがホストと一致しません。予想される127.0.0.1、temphostを取得しました

commonNameを一般化する方法はありますか?

4

2 に答える 2

1

ユースケースでは、デフォルトのホスト名チェックは適切ではありません。証明書のフィンガープリントチェックを実行してみてください。まず、各証明書のフィンガープリントを取得します(openssl x509-fingerprint)。ピアAとピアBがあり、それぞれフィンガープリントAとフィンガープリントBがあるとします。

ピアA側では、スクリプトの早い段階で次の呼び出しを行います。

from M2Crypto import SSL
SSL.Connection.clientPostConnectionCheck = SSL.Checker(peerCertHash='fingerprint B')

ピアB側では、指紋Aを使用することを除いて、同じことを行います。これで、証明書チェッカーは指紋が一致することを確認するだけで、それ以上のチェックは行いません。

このアプローチは、すべてのSSL接続の接続後チェックをオーバーライドすることを意味するため、すべてのユースケースに適しているわけではありません。SSL.Connectionオブジェクトの作成を制御できる場合は、インスタンスごとにset_post_connection_check_callback()を呼び出すこともできます。これにより、必要に応じて異なるチェッカーを使用できるようになります。

于 2010-01-27T21:46:54.880 に答える
1

それで、私の最初の答えに対するあなたのコメントに基づいて、私はあなたのケースに役立つかもしれない別の解決策を提供することに決めました。独自のCA証明書とキーを作成します。次に、ピアでM2Cryptoに、このCAによって署名された証明書のみを受け入れるように指示します(使用するAPIについては、この古いスタックオーバーフローの質問を参照してください:M2Cryptoのset_client_CA_list_from_file()とload_verify_info()の違いは何ですか?また、それぞれをいつ使用しますか?)。

次に、スクリプトの早い段階でこれを行います。

from M2Crypto import SSL
SSL.Connection.clientPostConnectionCheck = None

または、他の種類のSSL接続を確立できる必要がある場合は、SSL.Connectionオブジェクトの作成を制御できるかどうかを確認し、適切なチェッカーを使用してそれらのset_post_connection_check_callback()を呼び出します。

この後、ピアの証明書がCAのみで署名されている限り、ピアは他のピアを受け入れる必要があります。

接続後のチェックで確認できる追加情報があれば、その情報を証明書(おそらくcommonName)に入れて、使用する独自のチェッカーを作成できます(上記のNoneの代わりに)。

于 2010-01-28T01:39:23.347 に答える