WinHttp:如何使用临时证书存储?

2023-12-24

我有一个 C++ 应用程序,它与我们的一台服务器建立 HTTPS 连接。 在我的理想世界中,我希望发生以下情况:

  1. 应用程序启动
  2. 应用程序使 Windows 信任服务器的根 CA(请不要使用 GUI,只需系统调用)
  3. 应用程序与服务器对话,执行其工作等。
  4. 应用程序使 Windows 忘记服务器的根 CA
  5. done

I do NOT希望此根 CA 必须受到其他应用程序的信任。因此我不想在系统范围内安装证书。 如果用户不需要管理员权限,我也希望它。

我最初的计划是创建一个内存中 (CERT_STORE_PROV_MEMORY) 存储,将我的证书添加到其中,然后使用 CertAddStoreToCollection 将该内存中存储添加到系统存储中。

虽然所有 CryptoAPI 函数调用都成功,但 WinHttp 不喜欢它。

这是我正在做的事情的骨架 - 也许有人知道一个技巧? 或者也许这从一开始就是错误的?

hMemStore = CertOpenStore(CERT_STORE_PROV_MEMORY, ...);
pCert = CertCreateCertificateContext(..., pCertBytes, ...);
CertAddCertificateContextToStore(hMemStore, pCert, ...);
hRootStore = CertOpenSystemStore(NULL, "ROOT");
CertAddStoreToCollection(hRootStore, hMemStore, ...);

// Then later on...
WinHttpSendRequest(...)

一些注意事项:

  • 当我使用 WinHttp 的 SECURITY_FLAG_IGNORE_UNKNOWN_CA 时,一切正常,所以我相当确定这确实是问题所在。
  • 我已经看过了这个问题 https://stackoverflow.com/questions/656706/installing-root-ca-cert-via-code-on-win32- 它很接近,但没有解决仅制作证书的问题暂时地在应用程序运行时受信任。

Thanks!


由于您不希望其他应用程序信任此证书,因此您需要自己完成部分证书验证。使用选项 SECURITY_FLAG_IGNORE_UNKNOWN_CA 禁用 CA 检查,然后获取连接到服务器 WINHTTP_CALLBACK_STATUS_CONNECTING_TO_SERVER 的回调。在该回调中,使用 WINHTTP_OPTION_SERVER_CERT_CONTEXT 获取证书并进行验证。如果不是您想要的人,请取消/关闭请求;如果正确,则继续请求。

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

WinHttp:如何使用临时证书存储? 的相关文章

随机推荐

  • 如何通过拨动开关应用设置? [复制]

    这个问题在这里已经有答案了 可能的重复 谁能告诉我如何使用开关 https stackoverflow com questions 5639372 can anyone tell me how to use switch 嗨 我有两个视图
  • CSS线性渐变不准确?

    对于我的应用程序 我希望制作一个可以提供 0 度到 360 度之间任何色调的调色板 我目前正在使用此代码来制作调色板 我们以色调 120 纯绿色 为例 function drawPalette hue var ctx document qu
  • 领域驱动设计和实体框架 4.1(代码优先)

    我目前正在学习领域驱动设计开发方法 并使用 Tim McCarthy 编写的 NET 领域驱动设计与 C 一书作为指南 这本书确实很有帮助 但在使用实体框架时我变得有点困惑 特别是 4 1 中提供的代码优先方法 根据书中的示例 分层架构方法
  • 从包含合并单元格的表格中删除范围

    基本上 我想要完成的是 删除表中从光标在表中的位置到表末尾的所有行 问题是该表包含垂直合并的单元格 因此当我尝试执行以下操作时 For i Selection Tables 1 Rows Count To Selection Cells 1
  • 如何使用 Moq 库创建 SerialPort 模拟?

    我必须编写大量处理串行端口的代码 通常 电线的另一端会连接一个设备 我通常会创建自己的模拟来模拟它们的行为 我开始考虑 Moq 来帮助我进行单元测试 当您只需要一个存根时 使用它非常简单 但我想知道是否可能 如果可以 如何为硬件设备创建一个
  • 在 Mono 中保留退出代码

    我有一个使用 C 编写的简单应用程序 它通过命令行参数接受操作数 并通过退出代码报告成功或失败 当通过批处理文件在 Windows XP 上运行时 MyProg exe Snip Command line Params echo error
  • 获取chrome的控制台日志

    我想构建一个自动化测试 所以我必须知道chrome控制台中出现的错误 有一个选项可以获取控制台中出现的错误行吗 为了查看控制台 右键单击页面中的某个位置 单击 检查元素 然后转到 控制台 我不懂 C 但这是完成这项工作的 Java 代码 我
  • iTextSharp生成PDF:如何将pdf发送给客户端并添加提示?

    我使用 iTextSharp 生成了一个 pdf 当它创建时 它会自动保存在服务器上我的代码中提供的位置 而不是客户端 当然不会告诉用户任何信息 我需要将其发送给客户端 并且需要提示一个对话框来询问用户想要将其pdf保存在哪里 请问我该怎么
  • 我们是否应该在 JavaFX 自定义控件中使用 FXML?

    似乎很想问这个问题 我认为使用 FXML 来编写我们的自定义组件显然是正确的方法 但从ControlsFX JFXextras甚至 掌握JavaFX8控件 一书中我们可以看到 在自定义控件中都没有使用或提及FXML的使用 尽管如此 官方文档
  • 是否可以在泛型函数中排除引用参数?

    由于泛型类型参数T可以是任何类型 包括引用 我想知道是否可以选择退出泛型函数中的引用 即能够编写如下内容 use std ops Deref fn foo
  • Rails ActiveRecord:没有主键的旧表显示结果为零?

    我有一个 Rails 应用程序 它将位于遗留数据库之上 其中有一些我必须处理的丑陋的表 一个是一个feature attributes相关表features 问题是这个feature attributes表没有主键 我不认为这会成为问题 但
  • Ruby Koans:这个返回值中的引号在哪里?

    我正在研究以下 Ruby Koan class Dog7 attr reader name def initialize initial name name initial name end def get self self end de
  • 在 Visual Studio Express 2013 中创建解决方案文件夹

    我注意到 当您在 VS 2013 Express 中打开包含解决方案文件夹的解决方案时 它们会正确加载并且解决方案会正确构建 与 Visual Studio 2010 的 Express 版本不同 它在加载解决方案时显示错误消息 Here
  • 具有 SelectList 设计决策的 ViewModel

    我创建了一个视图模型 public VMPosition public VMPosition for model binder public VMPosition int EmployeeID PositionStatusList new
  • 如何禁用 Cloud Firestore?

    我在 Firebase 中使用实时数据库 偶然点击了 Cloud Firestore 从那时起 每当我想访问实时数据库时 它默认为 Cloud Firestore 我必须单击并选择我正在使用的数据库 非常烦人 有没有办法禁用或删除它 有没有
  • 如何更改默认布局目录?

    我的应用程序具有站点公共部分的所有控制器Utilisation模块并且它们都继承自Utilisation UtilisationController 我想为这些控制器设置默认布局 utilization layouts html erb 我
  • 为什么我必须使用 UIElement.UpdateLayout?

    我们有一个相当大的 WPF 业务应用程序 我正在对现有的 WPF 固定页面 固定文档报告进行重组 这是一个有点繁忙的生态系统 我们有一个内置的表单生成器 您可以添加许多不同的控件 就像一个迷你的内置视觉工作室 一切都很好 您在屏幕上填写表格
  • PHP字符串转多级数组

    如何转换这个 字符串 arrKeys lev1 lev2 lev3 val foo 进入以下数组 Array lev1 gt Array lev2 gt Array lev3 gt foo 数组键的数量可能会有所不同 除最后一个之外的每个数
  • Achartengine 图例位置

    有谁知道如何更改图例的位置 我正在尝试扩展图表以利用所有空间 到目前为止我已经 mRenderer setMargins new int 20 30 50 0 这会将图表扩展得更低 但图例保持在同一位置 因此它现在位于 x 轴上方 I tr
  • WinHttp:如何使用临时证书存储?

    我有一个 C 应用程序 它与我们的一台服务器建立 HTTPS 连接 在我的理想世界中 我希望发生以下情况 应用程序启动 应用程序使 Windows 信任服务器的根 CA 请不要使用 GUI 只需系统调用 应用程序与服务器对话 执行其工作等