2008-09-10 12 views
3

.NET System.Security.SslStreamクラスを使用して、クライアント認証を使用してSSL/TLSストリームのサーバー側を処理しようとしています。.NET SslStreamでクライアント認証に受け入れられる証明書を指定する方法

ハンドシェイクを実行するには、私はこのコードを使用しています:

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

残念ながら、これは私のCryptoAPIの信頼されたルートストアにすべての証明書のsubjectnamesを含むCertificateRequestを送信SslStreamになります。

私はこれを無効にしたいと考えています。ユーザーが信頼されたルートストアに証明書をインストールまたは削除するように要求することはできません。

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

アイデア?

答えて

2

現在、.NETライブラリを使用しているようには見えません。

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

1

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

もしあなたが起こりたいことがなければ、あなた自身のルートストアをローカルに展開することができます。

0

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

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

+0

ラスマス、私は同じ問題を解決しようとしています。あなたは特定の解決策を見つけましたか? – cdpnet

+0

@cdpnet、私はSslStreamのMono実装を使用して解決しました。 –

関連する問題