クライアント証明書で動作するように構成された WCF サービスがあります。
クライアントは .net 3.5 WPF アプリケーションです。
テスト中、Microsoft CA などによって生成された証明書と完全に連携します。物理トークン (Aladdin/Safenet eToken Pro 64k) でテストしている間も、うまく機能します。
(最初にサーバーに接続しようとすると、「トークン ログオン」ウィンドウがポップアップします。トークンへの認証が成功すると、サーバー要求が機能し、次のサーバーへの接続試行は、トークン ログオン メッセージが表示されずに成功します)
ここで、トークンを削除して再挿入すると、同じ証明書で接続しようとすると、「要求が中止されました: SSL/TLS セキュア チャネルを作成できませんでした」というエラーが表示されます。HResult 0x80131509
再び機能させる唯一の方法は、アプリケーションを再起動することです。
証明書は System.Security.Cryptoragpy で取得されます。
var store = new X509Store("My", StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
//Getting the right certificate and then:
store.Close();
サーバーへの接続は次のコードを使用します。
string uriStr = txtUrl.Text + "/rest/auth/strong/Ping";
var client = WebRequest.Create(new Uri(uriStr)) as HttpWebRequest;
client.Method = "POST";
client.ContentType = "application/text; charset=unicode;";
client.ContentLength = 0;
client.PreAuthenticate = false;
client.KeepAlive = false;
client.ClientCertificates.Add(certificate); //Cert attached to the request
using (var res = client.GetResponse() as HttpWebResponse)
{
using (var responseStream = res.GetResponseStream())
{
using (var reader = new StreamReader(responseStream))
{
string s = reader.ReadToEnd();
ShowAndWriteToFile(s);
}
}
}
詳細ログと Wireshark キャプチャを調べましたが、そこから問題を見つけることができませんでした。
私が試した他のもの:
- 暗証番号キャッシュのクリア – トークンを削除する前にキャッシュをクリアすると、次にサーバーに接続しようとすると、「トークン ログオン」ウィンドウがポップアップします。削除して再挿入した後にクリアしても、何も変わりませんでした。
- WCF サービスの再起動 - トークンを再挿入した後も結果は同じです。
- トークンの削除と再挿入の前後に、証明書に対する他の操作がどのように動作するかを確認します。たとえば、トークンを削除して再挿入した後、証明書を使用してメッセージに署名して検証すると、「トークンログオン」ウィンドウが再びポップアップし、引き続き機能します。
- ストアに置かれた自己作成の証明書に接続しようとしました – 機能し、ストアから削除して再度追加しました – それでも機能しました.