2012-02-10 84 views
4

我想從ISAPI中的請求中檢索整個客戶端證書鏈。從ISAPI請求中檢索客戶端證書鏈

我已經成功通過調用下面的代碼來獲取客戶端的證書鏈中的第一個證書:

LPEXTENSION_CONTROL_BLOCK ecb_; 

... 

CERT_CONTEXT_EX cce; 
memset(&cce, 0, sizeof(CERT_CONTEXT_EX)); 
char certbuf[64*1024]; 
cce.cbAllocated = sizeof(certbuf); 
cce.CertContext.pbCertEncoded = (BYTE *) &certbuf; 
ecb_->ServerSupportFunction(ecb_->ConnID, HSE_REQ_GET_CERT_INFO_EX, &cce, 0, 0) 

但是,我沒有找到如何從這個CERT_CONTEXT_EX結構檢索證書鏈的其他部分。

回答

0

我剛碰到這個老問題。對不起,我沒有早點看到它。

很多年前,我寫了一個示例,說明如何使用CAPICOM來做到這一點。不幸的是CAPICOM正在被微軟逐步淘汰,儘管它仍然有效。

我發現Koders舊isapiCertPolicy樣品:

http://www.koders.com/cpp/fid977D79B2C51AD2423E4F57B6B36C3806F167CF79.aspx

下面是相關的代碼片段:

#import "capicom.dll" 

char CertificateBuf[8192]; 
CERT_CONTEXT_EX ccex; 
ccex.cbAllocated = sizeof(CertificateBuf); 
ccex.CertContext.pbCertEncoded = (BYTE*)CertificateBuf; 
ccex.dwCertificateFlags = 0; 
DWORD dwSize = sizeof(ccex); 

fOk = pCtxt->ServerSupportFunction(
    (enum SF_REQ_TYPE)HSE_REQ_GET_CERT_INFO_EX, 
    (LPVOID)&ccex, 
    &dwSize, 
    NULL); 

_bstr_t bstrCert(
    SysAllocStringLen(
     (OLECHAR *)ccex.CertContext.pbCertEncoded, 
     (ccex.CertContext.cbCertEncoded+1)/2), 
    FALSE); 

CAPICOM::ICertificate2Ptr Cert(__uuidof(CAPICOM::Certificate)); 
Cert->Import(bstrCert); 

CAPICOM::IChainPtr Chain(__uuidof(CAPICOM::Chain)); 
BOOL fOk = Chain->Build(Cert); 

CAPICOM::ICertificatesPtr Certs(NULL); 
Certs = Chain->Certificates; 

CAPICOM::ICertificate2Ptr ParentCert(Certs->Item[2]) 

的鏈對象建立的證書鏈。如果你不能使用CAPICOM,你可以使用Crypto API的CertGetCertificateChain函數來獲得證書鏈,但它更多的工作。