4

HTTPWebRequestを使用してクライアント証明書が必要なページにアクセスしています。HTTPWebRequestでクライアント証明書認証要求を検出する方法は?

私は次のコードを使用していますが、すべて動作します!

HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(textBox1.Text); 

    X509Certificate2 userCert = SelectClientCertificate(); 
    if (userCert != null) myReq.ClientCertificates.Add(userCert); 

    HttpWebResponse myResp = (HttpWebResponse)myReq.GetResponse(); 

今ここに私の問題は私のコールSelectClientCertificate()は、ユーザーが証明書を選択させるダイアログを示しているので、私はサーバーがクライアント認証を要求していない場合はダイアログを表示したくない、です!実際に私はInternet Explorerの行動主義を探しています。サーバーがユーザーのクライアント認証を必要とするページにアクセスする場合は、そうでない場合は証明書の選択ダイアログが表示されます。

私はAuthenticationManagerを見ましたが、本当に自分自身のAuthenticationModuleを登録する必要があるかどうかはわかりません。だから私のためのヒント?

また、403または403.7用のStatusCodeを確認しましたが、現在作業しているサーバーは、証明書が見つからない場合は200が返されます。コンテンツには許可されていません。

+0

こんにちは、この問題の解決策を見つけましたか? – Zaky

+0

こんにちは、私もあなたが1つ持っている場合は、ソリューションに興味があります。 – ianbeks

+0

私は同じ質問があります。 – justcoding124

答えて

0

なぜサーバーが何を望んでいるかチェックしますか?リクエストはhttpsで実行され、証明書を要求するだけです。

私がうまく覚えていれば、サーバーは誰にも義務付けられていません。実際のHTTP通信が行われる前に、SSLハンドシェークによる通信を開始し、クライアント/サーバが証明書を交換するのはクライアントの義務です。サーバーで証明書を提供する必要があるかどうかを検出する方法はありません。もしあなたがそれと話をしようとすると、あなたが証明書で始まらず、サーバーが証明書を望むならば、サーバーは接続を中断して静かにするか、多分ランダムなエラーコードを返します。

サーバがハンドシェイクを試みた後にリクエストを作成または送信しようとすると、早期に検出しようとすることはできますが、TCPレイヤーで下のレイヤーを実行する必要があります。 HTTPS交渉やハンドシェイクの選択を記述したRFCをチェックしてみてください。ちょっと役立つかもしれません。

HTTP要求に失敗した場合は、証明書を要求してやり直してHTTPSで再試行してください。私はあなたのユーザーがそれを生き残るだろうと思う。

+0

必要な場合、サーバーはクライアントに証明書の送信を要求します。 SSLの相互認証を確認してください。あなたの発言は間違っています。 – justcoding124

+0

HttpWebRequestクラスで可能なことについての一般的な答えとヒントを混ぜたので、ちょっと混乱するかもしれません。要点は、(AFAIR)HWRクラスは、「I-Demand-A-Certificate」イベントまたは拡張ポイントを公開していないということでした。あなたは証明書なしで要求を実行しなければならず、失敗の準備ができています(つまり、証明書付きのレターリー)。最初の要求が送信される前に早めに証明書を提供する必要があります。不思議なことに、同じHWRクラスやその他のフレームワークでは、サーバーの証明書を即座に検証できる拡張ポイントが提供されます。私は彼らのビジョンを理解していません。 – quetzalcoatl

+1

LocalCertificateSelectionCallbackがSslStreamクラスで使用されているとします。しかし、HttpWebRequestクラスでは公開されていません。 http://msdn.microsoft.com/en-us/library/system.net.security.localcertificateselectioncallback.aspx – justcoding124

関連する問題