我们有一个配置为使用客户端证书的 WCF 服务。
我们的客户端是一个 .net 3.5 WPF 应用程序。
在测试时,它可以完美地与 Microsoft CA 和其他人生成的证书配合使用。在使用物理令牌(Aladdin/Safenet eToken Pro 64k)对其进行测试时,它也运行良好。
(第一次尝试连接服务器时会弹出“令牌登录”窗口。成功验证令牌后,服务器请求有效,下一次尝试连接服务器成功,但不显示令牌登录消息)
现在,如果我们删除令牌并重新插入它,当尝试使用相同的证书连接时,我们会收到错误“请求被中止:无法创建 SSL/TLS 安全通道”。HResult 0x80131509
让它再次工作的唯一方法是重新启动应用程序。
使用 System.Security.Cryptogragpy 检索证书:
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 服务 - 重新插入令牌后,结果仍然相同。
- 检查证书上的其他操作在删除和重新插入令牌之前和之后的行为方式。例如,如果我在删除并重新插入令牌后使用证书签署并验证某些消息,则“令牌登录”窗口会再次弹出并继续工作。
- 尝试与放在商店中的自行创建的证书连接 - 有效,然后从商店中删除并重新添加 - 仍然有效。