3

.Net System.Security.SslStream クラスを使用して、クライアント認証で SSL/TLS ストリームのサーバー側を処理しようとしています。

ハンドシェイクを実行するために、次のコードを使用しています。

SslStream sslStream = new SslStream(innerStream, false, RemoteCertificateValidation, LocalCertificateSelectionCallback);
sslStream.AuthenticateAsServer(serverCertificate, true, SslProtocols.Default, false);

残念ながら、これにより、CryptoAPI Trusted Root Store 内のすべての証明書のサブジェクト名を含む CertificateRequest を SslStream が送信することになります。

これをオーバーライドできるようにしたいと思います。信頼されたルート ストアから証明書をインストールまたは削除することをユーザーに要求することは、私にとって選択肢ではありません。

SslStream は下で SSPI/SecureChannel を使用しているように見えるので、その API で同等のことを行う方法を誰かが知っていれば、それも役に立ちます。

何か案は?

4

3 に答える 3

3

これは現在、.NET ライブラリを使用して実行できるようには見えません。

System.Security.SslStream の Mono クラス ライブラリ実装を使用して解決しました。これにより、ハンドシェイク中のサーバーの動作をオーバーライドするためのアクセスが改善されます。

于 2008-09-15T12:10:32.083 に答える
2

証明書の検証が行っているのは、チェーン内のすべての証明書を検証することです。本当にそれをするために、それはそれらの証明書のそれぞれのルートストアに連絡するだけです。

それが起こりたくない場合は、独自のルートストアをローカルにデプロイできます。

于 2008-09-10T15:07:38.097 に答える
1

変更したいのは検証部分ではありません。問題は最初のハンドシェイクにあり、サーバーはクライアントにクライアント認証が必要であることを通知するメッセージ(つまりCertificateRequestメッセージ)を送信します。このメッセージの一部として、サーバーはクライアント証明書の発行者として受け入れるCAの名前を送信します。デフォルトでストア内のすべての信頼されたルートが含まれているのはそのリストです。

ただし、単一のアプリケーションの証明書ルートストアを上書きできる場合は、おそらく問題が解決します。それはあなたが意味することですか?もしそうなら、どうすればそれを行うことができますか?

于 2008-09-10T17:15:58.740 に答える