【发布时间】:2016-08-04 21:26:48
【问题描述】:
我正在使用 C++ 代码中的IXMLHTTPRequest3 向服务发出请求。此请求需要附有客户端证书(这几乎是 IXHR3 在 IXHR2 上添加的唯一内容)。
证书的指纹是8D1CC03002D7872230516B5C5BA1090084D68ED0,我已经验证它安装在电脑上:
PS> dir cert:\*\*\* | ? { $_.Thumbprint -eq "8D1CC03002D7872230516B5C5BA1090084D68ED0" }
Directory: Microsoft.PowerShell.Security\Certificate::LocalMachine\My
Thumbprint Subject
---------- -------
8D1CC03002D7872230516B5C5BA1090084D68ED0 DC=..., O=..., OU=...
但是,当我尝试将该指纹传递给 IXHR3->SetClientCertificate 时,我得到了 0x80092004、CRYPT_E_NOT_FOUND。
我将哈希从十六进制字符串转换为 20 字节数组(通过自动化来避免最终的转置错误),我的调用如下所示:
uint8_t thumbprint[20] = { 0x8d, 0x1c, 0xc0, 0x30, ... };
hr = request->SetClientCertificate(ARRAYSIZE(thumbprint), thumbprint, nullptr);
问题显然是:为什么 IXHR3 找不到我的客户证书?
【问题讨论】:
-
使用
CryptUIDlgSelectCertificateFromStore()选择证书是否也有同样的问题?请参阅this example,它使用来自this implementation 的SelectCert()方法。 -
@RemyLebeau,我应该首先注意到它在 Azure 上运行。真正的过程是在非交互式会话中启动的,所以我无法看到那里实际发生了什么。但是,当我通过 RDP 手动运行程序时,会显示我的证书,当我选择它时,它会给出我期望的指纹。
标签: c++ windows http ssl-certificate client-certificates