2012-02-10 19 views
4

ISAPIの要求からクライアント証明書チェーン全体を取得したいと考えています。ISAPI要求からクライアント証明書チェーンを取得する

私はすでに以下のコードを呼び出すことによって、クライアントの証明書チェーン内の最初の証明書を取得することに成功した。しかし、私はこのCERT_CONTEXT_EX構造体からの証明書チェーンの残りの部分を取得する方法を見つけることができませんでした

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) 

を。

答えて

0

私はこの古い質問に出会ったばかりです。私は早くそれを見ていなかったのは残念です。

私は何年も前に、CAPICOMを使ってこれを行うサンプルを書きました。残念ながら、CAPICOMはMicrosoftによって段階的に廃止されていますが、まだ機能しています。

私は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関数を使用して証明書チェーンを取得することができますが、それはより多くの作業です。

関連する問題