如何清除任何 SSL 证书数据

2023-12-29

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

ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate);

ValidateRemoteCertificate 方法处理证书异常。

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

到目前为止,一切都很好。

场景如下:

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

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

我尝试寻找任何清除 ServicePointManager 中的任何委托/事件的方法,但我找不到任何方法。

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


我知道已经过去近 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 { }
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何清除任何 SSL 证书数据 的相关文章

随机推荐

  • 所有小部件的颤动填充?

    我正在尝试在卡片小部件中的某些文本和图标的顶部和底部添加一些填充 我发现 flutter 有一种简单的方法可以对容器执行此操作 但似乎找不到对其他小部件执行此操作的方法 除了将它们包装在容器中之外 这是我到目前为止得到的代码 body ne
  • “use asm”到底是做什么的?

    据我所知 Asm js只是JavaScript的严格规范 它使用了JavaScript的特性 并不是一门新语言 例如 不要使用var a e 它提供var a e 0 我的问题是 如果asm js只是一个定义 并且可以通过改变使用和声明变量
  • 从 Symfony2 控制器中删除 Doctrine 生命周期事件

    我正在寻找删除一个Doctrine Extensions 生命周期事件监听器 https github com l3pp4rd DoctrineExtensions blob master lib Gedmo Tree TreeListen
  • 从 ClaimsIdentity 检索 WindowsIdentity 的最佳方法是什么

    到目前为止 我找到了两种从 ClaimsIdentity 获取 WindowsIdentity 对象的解决方案 首先 我提取用户主体名称 upn ClaimsIdentity ci ClaimsIdentity Thread Current
  • Ag-Grid 链接与单元格中的链接

    我正在使用 ag grid 构建 Angular 4 应用程序 但在尝试找出如何在单元格中放置链接时遇到问题 有人可以帮我解决这个问题吗 谢谢 请检查这个demo https plnkr co edit anJSAE p preview c
  • 如何在 Rust 中序列化 Arc>?

    我有一个特质DataSet 我已经实现了Serialize像这样 impl Serialize for dyn DataSet fn serialize
  • 仅通过客户端使用 Firestore 及其功能是否安全? [复制]

    这个问题在这里已经有答案了 如果我在应用程序中使用 prod 环境变量并为 Firestore 设置服务器端规则 我的应用程序是否可以完全安全地执行 CRUD 和身份验证 我问这个问题是因为我一直在观看相当著名的 YouTube 内容创建者
  • 使用 jQuery 重新加载 MVC2 用户控件

    我知道我今天有很多问题 但仍然试图以正确的方式学习 MVC 2 来控制一切 在我进入这个问题之前 我已经尝试过提供的解决方案here https stackoverflow com questions 826450 how can i re
  • 如何在 OS/X 中将 shell 变量设置为求值结果

    在 Linux Bash 中我可以执行以下操作 export CP cat classpath txt 如果我们执行 cat classpath 我们会看到一个非常长的输出 这就是我不在这里重现的原因 然而在 OS X 中 相同的命令会导致
  • 如何将 jpeg 图像目录转换为张量流中的 TFRecords 文件?

    我的训练数据是 jpeg 图像的目录和包含文件名和关联类别标签的相应文本文件 我正在尝试将此训练数据转换为 tfrecords 文件 如张量流文档中所述 我花了相当多的时间试图让它工作 但张量流中没有示例演示如何使用任何读取器读取 jpeg
  • 根据另一个数组的元素对一个数组进行排序

    我有一个 id 数组 a1 1 2 3 4 5 我还有另一个 id 为随机顺序的对象数组 a2 obj with id 5 obj with id 2 obj with id 1 obj with id 3 obj with id 4 现在
  • MVC 3、CSS、Razor 和 Visual Studio 2010

    你们如何管理 MVC 3 项目中的所有 css 样式 即使在安装了 Visual Studio 2010 SP1 后 我发现 css 样式管理器仍然无法识别布局视图文件中的样式表链接 我猜 Expression Web 还没有对这些东西的任
  • 访问 MailChimp API 3.0 (GET)

    我正在尝试通过 jQuery 向 Mailchimp API 发出 GET 请求 看来我的自定义标头设置不正确 因为我得到了Your request did not include an API key error 如果我在我的 Ubunt
  • python 和 selenium webdriver 等待时间等于特定时间

    I m new python 3 user 我有一个通过 python 3 进行网络抓取的项目 我必须等到登录网络目标后时间为 08 22 00 PM 我有项目 没有任何问题 但我只想导入 直到特定时间并再次继续 您有任何想法吗 或者您可以
  • 我们可以为内部应用程序共享设置更新优先级(在应用程序更新中进行测试)吗?

    根据文档 https developer android com guide playcore in app updates test 我们可以通过执行以下步骤 使用内部应用共享来测试应用内更新 确保您的测试设备安装了支持应用内更新的应用版
  • /bin/sh:奇数字符串比较错误“意外的运算符”[重复]

    这个问题在这里已经有答案了 发现这个错误非常奇怪 因为以前我的脚本可以工作 但是当我将它从我正在处理的服务器移动到本地计算机后 它停止工作并给了我一个 意外的操作员 错误 Else if the script is being run in
  • 什么是无符号数据类型?

    我见过这个unsigned 无类型 类型使用了几次 但从未见过对此的解释 我想应该有一个对应的signed类型 这是一个例子 static unsigned long next 1 RAND MAX assumed to be 32767
  • 如何告诉 RStudio 使用 Anaconda 的 R 版本

    我已经在我的 mac os x yosemite 上安装了 anaconda 和 conda 包 R 当我打字时 which R 在我的终端中 我得到以下输出 Users giovannisoldi anaconda bin R 所以它实际
  • 我的 Susy 布局中出现奇怪的错位

    我给Susy设置的元素span column mixin to 不服从它 它们稍微错位了 如何实现 HTML 元素的完美对齐 完整网站错位的屏幕截图 Detail
  • 如何清除任何 SSL 证书数据

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