根据自签名证书颁发机构验证服务器证书

2023-11-27

我有自定义服务器/客户端应用程序,它们使用 SSL 加密的 TCP 连接(自定义协议)相互通信。为了设置服务器证书,我创建了一个自签名证书颁发机构,并使用它来签署证书以供服务器使用。在客户端,我想验证我正在连接的服务器的证书是否由我的自签名 CA 签名。

通过使用 load_verify_file() 函数向 ssl::context 提供自签名 CA 证书,我能够在 C++ 中使用 boost 来实现此功能。我想在 C# 客户端中实现相同的功能,但 .NET SSL 的内容似乎对于信任不在 Windows 信任存储中的证书要严格得多。

到目前为止,我在搜索中找到了几个部分解决方案。显然X509Chain 是用于验证 SSL 证书的类。我试过代码像这样但手动创建的链仍然抱怨根证书不受信任,就像传递到验证函数的原始链一样。有一个选项可以忽略未知的证书颁发机构,但这似乎意味着它会接受any自签名证书,这绝对不是我想要的。

这是似乎最接近我想要的代码,但如上所述,我遇到的问题是它仍然抱怨我添加到 ExtraStore 的证书是自签名的。有什么方法可以让X509Chain相信我给它的证书吗?

bool remoteCertificateValidationCallback(
    object sender, X509Certificate certificate, X509Chain chain,
    SslPolicyErrors sslPolicyErrors)
{
    // make sure certificate was signed by our CA cert
    X509Chain verify = new X509Chain();
    verify.ChainPolicy.ExtraStore.Add(secureClient.CertificateAuthority); // add CA cert for verification
    //verify.ChainPolicy.VerificationFlags = X509VerificationFlags.AllowUnknownCertificateAuthority; // this accepts too many certificates
    verify.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; // no revocation checking
    verify.ChainPolicy.RevocationFlag = X509RevocationFlag.ExcludeRoot;
    if (verify.Build(new X509Certificate2(certificate)))
    {
        return true; // success?
    }
    return false;
}

我怀疑您的私有 CA 证书未安装在当前系统(运行代码的位置)上或者安装不正确。根 CA 证书必须安装在计算机的受信任根 CA 容器中,而不是安装在当前用户存储中。默认情况下,X509Chain使用计算机商店查找可信锚点。

此外,您的代码无法执行您想要的操作。它将接受并传递任何公共信任的根 CA。相反,您需要比较中的最后一个元素X509Chain.ChainElements,所包含的证书是否是您期望的证书(通过比较指纹值)。应应用以下修复:

if (verify.Build(new X509Certificate2(certificate)))
{
    return verify.ChainElements[verify.ChainElements.Count - 1]
        .Certificate.Thumbprint == cacert.thumbprint; // success?
}
return false;

where cacert是您的根 CA 证书。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据自签名证书颁发机构验证服务器证书 的相关文章

  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 将 System.Windows.Forms.Keys 序列转换为 Char

    有没有办法转换由 Keys 枚举表示的击键序列 即System Windows Forms Keys 在一个字符中 例如 Keys Oem4进而Keys A产生 char 它一定存在于 WinAPI 中的某个地方 因为当我在文本框中按下按键
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器

随机推荐

  • 使用php向oracle数据库插入数据

    下面的代码正在生成这个 Warning oci execute function oci execute ORA 00911 invalid character in F wamp www SEarch Engine done php on
  • 绑定 SelectedItem 与 SelectedIndex - 我什么时候应该选择其中之一?

    假设您有一个对象类型 Foo 的可观察集合 并且有一个用户将从中进行选择的自定义 ListView 您绑定的数据对象 property with getter setter INotifyPropertyChanged Observable
  • 如何列出所有未更改(跟踪)的文件?

    我将旧的 git image 解压缩到我的 git 存储库中 大部分文件已更改 我想知道哪些文件保持不变 如何列出这些文件 我没有找到任何纯粹的 git 内容 但使用一些 bash 是可能的 git ls files modified gi
  • 如何在一秒内计算任意 n <= 600 的最短加法链?

    你如何计算最短加成链 sac 对于一秒内任意 n Notes 这是编程竞赛codility这个月 加法链在数值上非常重要 因为它们是计算 x n 通过连续乘法 的最经济的方法 Knuth s 计算机编程艺术 第 2 卷 半数值算法对加法链和
  • (如何)我可以增加Android WebView中LocalStorage的配额限制

    我需要增加 Android WebView 中 LocalStorage 的默认配额限制 目前我只能使用大约2 5MB 当尝试存储更多数据时 quota exceeded err dom exception 22 被提出 有什么想法或者我必
  • 无法使用 ruby​​ selenium webdriver 连接到浏览器

    我尝试使用 ruby selenium webdriver 运行一些基本的自动化测试 相同的代码在我的家庭计算机上完美运行 但在位于代理 不需要身份验证 后面的工作计算机上失败 驱动程序 Selenium WebDriver for fir
  • mongo-go-driver 通过 _id 查找文档

    我试图通过自动生成的 id 字段查找文档 下面的代码不返回任何内容 var documentID bson RawValue documentID Type 7 documentID Value byte 5c7452c7aeb4c97e0
  • JList 项目中的自动换行

    我有一个JList项目名称很长 导致水平滚动条出现在滚动窗格中 无论如何 我可以自动换行 以便整个项目名称显示在两行中 但可以一键选择吗 I E它仍然应该behave作为一个单一的项目 但显示的分成两排 这是我在看到下面的例子后所做的 我向
  • 如何使用networkx绘制子图

    我尝试根据节点名称列表从 networkx 中的 karate club graph 绘制子图 但失败了 如何绘制我想要显示的子图 import networkx as nx from matplotlib import pylab as
  • jQuery 获取选择选项 ID 并更改隐藏输入值

    我有一个带有选择列表的表单 每个选项还包含一个动态 ID 我需要捕获该 ID 然后使用它来更改隐藏输入的值 因此 基本上采用选定的选项 id 并更改隐藏输入值的值 我的选择和隐藏输入如下所示
  • 有人可以向我解释一下 Java 中通过“值”而不是“引用”传递的原因是什么吗?

    我对 Java 相当陌生 多年来一直在写其他东西 除非我遗漏了一些东西 并且我很高兴在这里犯了错误 否则以下是一个致命的缺陷 String foo new String thisDoesntWork foo System out print
  • Hibernate:hbm2ddl 反转列顺序[重复]

    这个问题在这里已经有答案了 我让 hbm2ddl 为我创建表 出于开发目的 并且列的顺序与类中字段的顺序相反 我怎样才能让它以与类相同的顺序创建列 我认为 Java 类不存储字段的顺序 因此 Hibernate 根本不知道源中的顺序是什么
  • 使用已知但无法访问的 wsdl 创建 Web 服务客户端

    与我们合作的一家公司通过电子邮件向我们提供了 wsdl 和 xsd 架构 我们所连接的 Web 服务是通过 IPsec 隧道访问的 已发布的 WSDL 中有本地引用 在其末尾 这意味着我们无法使用它 第一个问题 这是常见的设置吗 我认为拥有
  • Celery任务链取消?

    我发现celery支持任务链 http celery readthedocs org en latest userguide canvas html chains 问题是 如何停止任务中链的执行 例如 我们得到了 N 个项目的链 N gt
  • 使用主应用时如何刷新Widget?

    我正在使用一个UIKit应用程序并添加了一个小部件SwiftUI and Widgetkit 现在 当用户在主应用程序中执行某项操作时 我想更新小部件 通常我应该使用WidgetCenter shared reloadAllTimeline
  • 如何在 Selenium WebDriver 中检查单选按钮是否被选中?

    这是我的 HTML 代码 div class selectCard left div
  • 使用 Carrierwave (HTML5) 将多个文件一次上传到 Rails 应用程序

    我很接近 非常接近 我可以很好地上传单个文件 但是当我更改表单的类型时file field to multiple gt true所以我可以一次上传多个图像 我上传的文件被包装在一个数组中 并且 accepts nested attribu
  • iOS 8 Today 扩展中的拖动手势

    我正在使用一个UIView我的 今日 小部件中的子类 该视图使用滑动手势 然而 这些手势要么上下滚动整个通知中心 要么使通知中心从Today to 通知 有什么办法可以防止触摸事件冒泡到通知中心滚动视图吗 使用 self setExclus
  • 使用 SASS 时如何从不同目录导入文件?

    在SASS中 是否可以从另一个目录导入文件 例如 如果我有这样的结构 root directory sub directory a common scss template scss sub directory b more styles
  • 根据自签名证书颁发机构验证服务器证书

    我有自定义服务器 客户端应用程序 它们使用 SSL 加密的 TCP 连接 自定义协议 相互通信 为了设置服务器证书 我创建了一个自签名证书颁发机构 并使用它来签署证书以供服务器使用 在客户端 我想验证我正在连接的服务器的证书是否由我的自签名