LANコンピュータが相互に通信できるようにするためのクライアントサーバーライブラリを作成しようとしています。これは主に独学の試みであるため、SSLを介してこれらの接続を確立しようとしています。私の計画は、単一のホストマシンを維持し、各クライアントにホストに対して相互に認証されたSystem.Net.SslStreamインスタンスを維持させることです。ホストコードは(大まかに言えば)次のようになります(簡潔にするためにエラー処理は省略されています)。
SslStream newStream = null;
newStream = new SslStream(this.client.GetStream(), false);
newStream.AuthenticateAsServer(
this.Certificate as X509Certificate,
true,
System.Security.Authentication.SslProtocols.Tls,
false);
if (!(
newStream.IsMutuallyAuthenticated &&
newStream.IsEncrypted &&
newStream.IsSigned))
{
throw new AuthenticationException("Authentication results unsatisfactory.");
}
これにthis.Certificate
は、X509Certificate2があります。クライアントコードは次のようになります。
SslStream connectionStream = new SslStream(this.client.GetStream(), false);
connectionStream.AuthenticateAsClient(
this.ServerHostname,
new X509CertificateCollection(new X509Certificate[] { (X509Certificate)this.Certificate }),
SslProtocols.Tls,
false);
if (!(
connectionStream.IsEncrypted &&
connectionStream.IsMutuallyAuthenticated &&
connectionStream.IsSigned))
{
throw new AuthenticationException("Authentication results unsatisfactory");
}
この投稿の指示に従ってクライアントとサーバーの証明書を生成し、クライアントとサーバーの両方のローカルマシンの信頼できる機関にルート機関をインストールしました。次に、クライアントとサーバーの両方の証明書を生成し、クライアント/サーバーにアクセスできる場所に.cerファイルのコピーを配置し(X509Certificateオブジェクトを取得するためにロード)、それぞれのマシンのパーソナルストアに秘密鍵を使用してインストールしました。これで、クライアントとサーバーが同じマシン上にある場合にすべてが機能します。しかし、新しい証明書を生成して2台目のマシンに配置すると、クライアントとサーバーが相互認証に失敗するようになりました。接続はセットアップされ、暗号化され、署名されますが、IsMutuallyAuthenticatedはfalseです。どうすればこれを修正できますか?私は何が間違っているのですか?
編集:LocalCertificateSelectionCallbackと他のコールバックは、クライアントが1つのローカル証明書を検出したことを示しています。これは私のものであり、リモート証明書はなく、受け入れ可能な発行者もありません。私の証明書が選択され、ローカル証明書の選択から返されます。クライアント側ではSSLポリシーエラーは発生せず、ホスト側でもRemoteCertificateNotAvailableが発生します。このトランザクションをWiresharkでスニッフィングすると、標準のTCPハンドシェイクに続いて、ホスト証明書の名前を含む数百バイトのジブリッシュ、トランザクションの終了を示すFIN、ACKパケットが表示されます。したがって、LocalCertificateSelectionCallbackルーチンによって選択されていても、クライアント証明書は実際には送信されていません。これは何が原因でしょうか?どうすれば修正できますか?