【发布时间】:2017-01-18 17:46:09
【问题描述】:
我需要为 Windows 编写一个 C 程序,它从网络接收证书(PEM 格式)并使用证书链文件(已在应用程序的文件夹中提供)验证其签名。
使用 openssl 库编写这样的应用程序非常简单,但使用 Windows Crypto API 似乎有点复杂。
这是我迄今为止尝试过的:
首先我认为我可以使用证书链文件创建 HCERTSTORE:
HCERTSTORE hFileStoreHandle = CertOpenStore(
CERT_STORE_PROV_FILENAME,
PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, NULL,
(CERT_STORE_OPEN_EXISTING_FLAG | CERT_STORE_READONLY_FLAG),
L"certificate-chain.pem.cert");
然后我想我可以遍历存储并获取证书的 PCCERT_CONTEXT 结构:
PCCERT_CONTEXT CAfileContext = NULL;
while(CAfileContext = CertEnumCertificatesInStore(
hCertStore,
CAfileContext)) {
//start verification here
}
我不知道我是否走在正确的轨道上,但我在这里面临两个主要问题。
首先,我不知道如何从缓冲区获取接收到的证书并将其转换为适当的结构,以便使用证书链文件验证其签名。
其次,我不知道如何使用 CA 链文件来验证证书签名。
我会感谢所有的建议和帮助。
【问题讨论】:
-
不要自己编写加密代码。
-
同意@stark,考虑使用内置
CertCreateCertificateChainEngine函数:msdn.microsoft.com/en-us/library/windows/desktop/… -
其实我不打算自己写,问题是,我不知道如何使用 Crypt api。
-
感谢@Crypt32,我已经开始研究如何将 CertCreateCertificateChainEngine 用于我的特定目的。
-
@Crypt32,不幸的是,在深入研究 CertCreateCertificateChainEngine 几天后,无法找到使用此功能的正确解决方案。
标签: c x509certificate cryptoapi