相关疑难解决方法(0)

如何清除任何SSL证书数据

我有一个客户端 - 服务器设置.客户端创建代理以与服务器通信.当通信协议是HTTPS时,代理通过以下行侦听SSL证书验证事件:

ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate);
Run Code Online (Sandbox Code Playgroud)

ValidateRemoteCertificate方法处理证书异常.

在客户端中,用户可以选择3个安全级别中的一个:低,中和高.在低级别,ValidateRemoteCertificate方法忽略任何错误并始终返回true.在中级,ValidateRemoteCertificate方法触发一个事件,通知客户端该问题.在此阶段,向用户显示消息,通知他证书存在问题,并允许用户选择是继续并接受与服务器的连接还是拒绝.在High级别,ValidateRemoteCertificate方法拒绝任何错误的连接.

到现在为止还挺好.

方案如下:

  1. 客户端加载了预定义的安全级别Medium,该安全级别已被用户接受,并且与服务器建立连接,而不会传播任何证书问题.
  2. 用户通过特殊按钮断开客户端与服务器的连接.
  3. 用户尝试重新连接客户端.在此阶段,客户端可以通过测试按钮测试连接.尽管已为连接测试创建了新代理,并且已从ServerCertificateValidationCallback(特定代理类型)中清除了所有ValidateRemoteCertificate方法,但测试方法返回成功.此外,不会为有问题的证书触发任何事件,也不会调用ValidateRemoteCertificate方法.

我试图实现的行为是,当执行测试时,ServerCertificateValidationCallback将在客户端启动并且ValidateRemoteCertificate发挥作用后表现为它是第一次调用它.

我试图找到任何方法来清除ServicePointManager中的任何委托/事件,但我找不到任何.

这里有缓存可以清除吗?我希望这个场景足够清晰.

c# ssl certificate

7
推荐指数
1
解决办法
1326
查看次数

SSL证书验证-是否涉及任何缓存?

案子:

  • 几天前,我们的集成合作伙伴错过了更改SSL服务器证书的截止日期,该证书的有效日期是两天前。
  • 发生这种情况时,我们的客户端软件开始引发异常:“根据验证过程,远程证书无效。” 我们的客户端软件使用.NET 4编写,可在Windows Server 2012上运行。SSL调用是通过WCF堆栈完成的。
  • 昨天下午,我们的集成合作伙伴安装了一个新的有效SSL证书。

现在的问题是,我们仍然在客户端上遇到相同的异常:“根据验证过程,远程证书无效。”

我的问题:

  • SSL证书验证状态是否以某种方式缓存在客户端上?我们的客户端软件是一个长期运行的过程,很少重启。
  • 还是这是SSL协议的固有部分?我不是SSL或网络专家,但a)仅在SSL握手期间,客户端会检查服务器证书,这是不正确的,并且b)SSL握手中交换的信息可用于对服务器进行的多个网络请求同一台服务器?如果确实如此,那么如何定义SSL握手有效的时间?

更新:我们重新启动了客户端进程,然后它可以工作。对我来说,这表明每个过程每个客户端都缓存了一些SSL服务器证书验证状态。我仍然非常想了解有关此细节的更多信息:在什么级别的堆栈上发生?WCF?。净?Windows API?缓存了多长时间?有什么办法可以调整缓存行为?我可以手动清空缓存吗?这是在某处记录的吗?

完整堆栈跟踪:

[E0]: The remote certificate is invalid according to the validation procedure. 
[T0]: System.Security.Authentication.AuthenticationException    at 
System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, 
AsyncProtocolRequest asyncRequest, Exception exception)     at 
System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, 
AsyncProtocolRequest asyncRequest)     at 
System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, 
AsyncProtocolRequest asyncRequest)     at 
System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, 
AsyncProtocolRequest asyncRequest)     at 
System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, 
AsyncProtocolRequest asyncRequest)     at 
System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, 
AsyncProtocolRequest asyncRequest)     at 
System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, 
AsyncProtocolRequest asyncRequest)     at 
System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, 
AsyncProtocolRequest …
Run Code Online (Sandbox Code Playgroud)

.net windows ssl https ssl-certificate

4
推荐指数
1
解决办法
1089
查看次数

标签 统计

ssl ×2

.net ×1

c# ×1

certificate ×1

https ×1

ssl-certificate ×1

windows ×1