- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试验证来自签名的证书链回到特定的根证书,Windows 不信任它(它是应用程序的私有(private)证书)。
我目前的尝试是创建一个链引擎,它只信任我想要的特定证书作为根证书,这样就不会生成其他链。
HCERTSTORE hPrivateRootStore = CertOpenStore(CERT_STORE_PROV_FILENAME, dwEncoding,
NULL, CERT_STORE_OPEN_EXISTING_FLAG | CERT_STORE_READONLY_FLAG,
_T("C:\\Test\\PrivateRoot.cer"));
CERT_CHAIN_ENGINE_CONFIG config;
memset(&config, 0, sizeof(config));
config.cbSize = sizeof(config);
config.hRestrictedTrust = hPrivateRootStore;
config.dwFlags = CERT_CHAIN_CACHE_ONLY_URL_RETRIEVAL | CERT_CHAIN_ENABLE_SHARE_STORE;
HCERTCHAINENGINE hEngine;
CertCreateCertificateChainEngine(&config, &hEngine);
CERT_CHAIN_PARA params;
memset(¶ms, 0, sizeof(params));
params.cbSize = sizeof(params);
PCCERT_CHAIN_CONTEXT chains = NULL;
if (CertGetCertificateChain(hEngine, pCertContext, NULL, hStore, ¶ms,
0, NULL, &chains))
...
(为清楚起见,省略了错误检查;pCertContext
和 hStore
来自 CryptQueryObject
,从已签名的二进制文件中提取签名和相关证书。)
不幸的是,这似乎行不通;尽管使用自定义链接引擎,它似乎仍在搜索操作系统商店,并且要么没有找到链,要么找到一个不同的根(操作系统信任)。我只能通过将我的私有(private)根证书添加到 OS 可信存储来获得我想要的链。
我还尝试将 config.hRestrictedOther
设置为一个空的内存存储,因为文档建议让 hRestrictedTrust
非 NULL 将再次引入系统存储,但这没有任何区别。
有没有我遗漏的东西,或者更好的方法?
编辑:只是为了提供更多上下文,我正在尝试做一些类似于驱动程序签名证书的事情,其中签名证书链回到两个不同的根:一个标准的 CA 根信任由操作系统和一个内部根(在驱动程序中也受操作系统信任,但在我的情况下只会受我的应用程序信任)。交叉发生在“主”链的中间某处;可能有许多不同的文件都使用不同的“真实”CA 签名,但仍链接回我的内部证书。
最佳答案
我现在找到了一个半生不熟的解决方法;它有点难看,但确实有用。我从
Chromium's test suite 得到了基本的想法;它涉及在 Crypt32 中安装一个 Hook ,这样当它尝试打开系统存储以构建链时,它会获取我的自定义存储,其中仅包含我想要的证书。
好处是,这似乎强制
CertGetCertificateChain
“通过”真正的 CA 证书并一直链接到我的自定义证书,而不是在 CA 证书处停止(这是它通常在受信任时所做的)。
坏处是它似乎无法阻止它建立链并信任任何其他 CA 证书。我可以通过显式验证链的根是我想要的证书来解决这个问题,但这不太理想,而且我不确定是否存在会导致它出错的情况。
仍在寻找更好的解决方案;我肯定觉得我在某处走错了路。
好的,新计划。我现在只是手动走链(因为我知道我关心的所有证书都在从签名的 .exe 中提取的 hStore
中),基本结构如下:
WinVerifyTrust
进行基本的“是否未被篡改”的身份验证。CryptQueryObject
从 .exe 中获取证书库 hStore
CryptMsgGetParam
和 CertFindCertificateInStore
从 hStore
中查找签名证书。CertFindCertificateInStore
和 CERT_FIND_SUBJECT_NAME
循环查找潜在的颁发者证书;继续往回走,直到我找到自签名证书或找到我想要的根(通过 CertComparePublicKeyInfo
检查匹配项)。CertVerifySubjectCertificateContext
表示签名不匹配,则放弃特定分支。看起来比我之前尝试的方法更清晰。想法/评论/替代方案?
(在某些方面似乎更有意义的是添加一个额外的自定义副署[类似于时间戳]而不是像这样尝试链接证书,但我找不到任何关于这样做的信息,或者优点/缺点是什么。)
关于c++ - 将证书链获取到私有(private)根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7551942/
据我所知,在 C# 中,所有字段默认都是私有(private)的,如果没有另外标记的话。 class Foo { private string bar; } class Foo { strin
这个问题在这里已经有了答案: Why is it allowed to access Java private fields via reflection? (7 个答案) 关闭 6 年前。 使用反
在 C#(和许多其他语言)中,访问相同类型的其他实例的私有(private)字段是完全合法的。例如: public class Foo { private bool aBool; pu
使用私有(private)方法通过将一些决策点重构为单独的方法来降低 CC 会降低实际方法的 CC 并易于阅读,但不会减少在测试中获得完整分支覆盖的工作量。 这合理吗?你有什么现场经验? 最佳答案 好
在下面的例子中,模块outer有一个私有(private)类型Private和一个私有(private)内部模块inner。 inner 能够访问Private(因为子模块可以访问其父级的私有(pri
class Person def one @var = 99 self.two end private def two p @var end end p=P
我在 Azure 中创建了 VNET。我放入了一个子集 Azure Private Link,它在 VNET 之外和另一台虚拟机中调用 Azure Function。 当我尝试通过专用 IP 调用专用
我在 Azure 中创建了 VNET。我放入了一个子集 Azure Private Link,它在 VNET 之外和另一台虚拟机中调用 Azure Function。 当我尝试通过专用 IP 调用专用
我正在尝试获得良好的 Ruby 编码风格。为防止意外调用具有相同名称的局部变量,我总是在适当的地方使用 self.。但是现在我偶然发现了这个: class MyClass "method" a
今天遇到一个案例类构造函数的奇怪问题。我想将构造函数设为私有(private),看来这不是问题。所以我已经在我的一个项目中尝试过它并且它有效。但在另一个项目中,我可以调用私有(private)构造函数
我想坚持使用记录,并且不想返回对象。所以我想知道是否可以将记录的字段设置为私有(private)?或者创建记录的私有(private)成员。其他具体类型(例如可区分联合)怎么样? 或者,这个要求是否违
我正在通过 Flickr API 进行经过身份验证的调用来访问照片。但我只得到我的公开照片,而没有任何私有(private)照片。 下面给出的是我正在使用的代码, Flickr f; Request
这两个类的行为不同;原因似乎与使用 private[this] 声明而不是 private 有关。有人可以解释一下为什么吗? 私有(private): class Person( private
在 private 中的 1000 秒 private 之后,我想到可能不需要它 public class Outer { private static class Inner { // yo
我有以下代码: class C { private enum E { // ... } } private extension C { func f(e: E)
OOP 语言中是否有object-private 的概念??我的意思是比经典的私有(private)访问限制更多? Private (or class-private) restricts the a
swift 3.0 我知道fileprivate访问级别修饰符将函数/属性的使用限制在声明它的源文件和 private - 仅限于声明的词法范围。但似乎这条规则不适用于扩展。例如。此代码有效: cla
即将推出的 Delphi 版本中启用该功能的功能怎么样? 也许它可能是一个编译器开关,促进所有 ** private **s to ** strict private **小号。 ... 或者它可能是
我可以通过将函数放入类的私有(private)扩展中来创建私有(private)函数,而不是通过不断调用 private func functionName(){} 来创建新的私有(private)函
部署专用端点并需要专用 IP 地址作为输出,但似乎无法正确获取值查询。下面的结果是“模板输出'主机名'无效:语言表达式属性|'privateIPAddress'具有无效的数组索引..(代码:Deplo
我是一名优秀的程序员,十分优秀!