2016-08-04 158 views
0

我使用C++代碼中的IXMLHTTPRequest3向服務發出請求。這個請求需要伴隨着一個客戶端證書(這只是IXHR3與IXHR2相比的唯一增加)。在IXMLHTTPRequest3中使用SSL客戶端證書

證書的指紋是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找不到我的客戶端證書?

+0

如果您使用['CryptUIDlgSelectCertificateFromStore()'](https://msdn.microsoft.com/en-us/library/windows/desktop/aa380288.aspx)選擇證書,是否也有同樣的問題?參見[這個例子](https://github.com/Microsoft/Windows-classic-samples/blob/master/Samples/XmlHttpRequest3GetRequest/cpp/XMLHttpRequest3Get.cpp),它使用[SelectCert()'方法[該實現](https://github.com/Microsoft/Windows-classic-samples/blob/master/Samples/XmlHttpRequest3GetRequest/cpp/XMLHttpRequest3Callback.cpp)。 –

+0

@RemyLebeau,我應該首先注意到這個在Azure上運行。真正的過程是在非交互式會話中啓動的,因此我無法看到實際發生的情況。但是,當我通過RDP手動運行程序時,我的證書顯示出來了,當我選擇它時,它會提供我期望的指紋。 – zneak

回答

1

IXHR3只查找CERT_STORE_PROV_SYSTEMCERT_SYSTEM_STORE_CURRENT_USER中的證書,而我的代碼是CERT_SYSTEM_STORE_LOCAL_MACHINE