owy*_*wyn 7 c# ssl certificate
我有一个客户端 - 服务器设置.客户端创建代理以与服务器通信.当通信协议是HTTPS时,代理通过以下行侦听SSL证书验证事件:
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate);
Run Code Online (Sandbox Code Playgroud)
ValidateRemoteCertificate方法处理证书异常.
在客户端中,用户可以选择3个安全级别中的一个:低,中和高.在低级别,ValidateRemoteCertificate方法忽略任何错误并始终返回true.在中级,ValidateRemoteCertificate方法触发一个事件,通知客户端该问题.在此阶段,向用户显示消息,通知他证书存在问题,并允许用户选择是继续并接受与服务器的连接还是拒绝.在High级别,ValidateRemoteCertificate方法拒绝任何错误的连接.
到现在为止还挺好.
方案如下:
我试图实现的行为是,当执行测试时,ServerCertificateValidationCallback将在客户端启动并且ValidateRemoteCertificate发挥作用后表现为它是第一次调用它.
我试图找到任何方法来清除ServicePointManager中的任何委托/事件,但我找不到任何.
这里有缓存可以清除吗?我希望这个场景足够清晰.
小智 6
我知道已经差不多4年了,但是我只是遇到了同样的问题,想要分享我的解决方案,其他任何人都会发现这个问题.
我找不到任何内置的方法来处理这个,所以查看了ServicePoint和ServicePointManager的源代码,这就是我想出的:
public void EnsureNoServicePointCertificate(Uri uri)
{
// find the service point for the Uri
ServicePoint sp = ServicePointManager.FindServicePoint(uri);
// Check if there is a service point and there is a certificate
if (sp != null && sp.Certificate != null)
{
try
{
// ServicePointManager has a hashtable (private static Hashtable s_ServicePointTable) of all service points
Type servicePointType = sp.GetType();
// ServicePoint.LookupString is the key for the hashtable
PropertyInfo lookupStringProperty = servicePointType.GetProperty("LookupString", BindingFlags.Instance | BindingFlags.NonPublic);
string lookupString = (string)lookupStringProperty.GetValue(sp, null);
// Get the hashtable from ServicePointManager
Hashtable s_ServicePointTable = (Hashtable)typeof(ServicePointManager).InvokeMember("s_ServicePointTable",
BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.GetField, null, null, null);
// ServicePointManager locks the hashtable and calls
// s_ServicePointTable.Remove(servicePoint.LookupString);
lock (s_ServicePointTable)
{
s_ServicePointTable.Remove(lookupString);
}
// At this point, ServicePointManager calls
// servicePoint.ReleaseAllConnectionGroups();
MethodInfo release = servicePointType.GetMethod("ReleaseAllConnectionGroups", BindingFlags.Instance | BindingFlags.NonPublic);
release.Invoke(sp, null);
}
catch { }
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1326 次 |
| 最近记录: |