我有一个客户端 - 服务器设置.客户端创建代理以与服务器通信.当通信协议是HTTPS时,代理通过以下行侦听SSL证书验证事件:
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate);
Run Code Online (Sandbox Code Playgroud)
ValidateRemoteCertificate方法处理证书异常.
在客户端中,用户可以选择3个安全级别中的一个:低,中和高.在低级别,ValidateRemoteCertificate方法忽略任何错误并始终返回true.在中级,ValidateRemoteCertificate方法触发一个事件,通知客户端该问题.在此阶段,向用户显示消息,通知他证书存在问题,并允许用户选择是继续并接受与服务器的连接还是拒绝.在High级别,ValidateRemoteCertificate方法拒绝任何错误的连接.
到现在为止还挺好.
方案如下:
我试图实现的行为是,当执行测试时,ServerCertificateValidationCallback将在客户端启动并且ValidateRemoteCertificate发挥作用后表现为它是第一次调用它.
我试图找到任何方法来清除ServicePointManager中的任何委托/事件,但我找不到任何.
这里有缓存可以清除吗?我希望这个场景足够清晰.
案子:
现在的问题是,我们仍然在客户端上遇到相同的异常:“根据验证过程,远程证书无效。”
我的问题:
更新:我们重新启动了客户端进程,然后它可以工作。对我来说,这表明每个过程每个客户端都缓存了一些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)