如何获得链中的下一个证书

How to get next certificate in chain

我想从 Windows 证书存储中获取父证书(或链中的所有证书)(假设我知道结束证书的位置)。我需要获得每一个以构建我自己的自定义 X509_STORE(使用 OpenSSL)。

我认为正确的做法是:

  1. 使用 CertFindCertificateInStore 获得第一个证书(完成)
  2. 使用 CertGetCertificateChain 获取证书链(完成)
  3. 从链中提取证书 (?)
  4. 对于链中的每个证书,使用 d2i_X509 转换它(完成)

  1. 使用 CertFindCertificateInStore 获得第一个证书(完成)
  2. 获取父证书(如果存在)(?)
  3. 使用 d2i_X509 进行转换,转到 2。(完成)

然后创建商店。

接下来要回答的问题是 - 如何使用 Windows 证书存储获取父证书或链中的所有证书?我可能在这里遗漏了一些或多或少的神秘功能。

由于 CertFindCertificateInStore 输出一个链上下文,可以使用漂亮的结构访问它的成员:

chainContext->rgpChain[0]->rgpElement[iCertIndex]->pCertContext->pbCertEncoded

其中 iCertIndex 介于 0 (end-certificate) 和 chainSize -1(self-signed 根证书)之间。