【问题标题】:retrieve the client certificate chain from an ISAPI request从 ISAPI 请求中检索客户端证书链
【发布时间】:2012-03-02 21:11:14
【问题描述】:

我想从 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 结构中检索证书链的其余部分。

【问题讨论】:

    标签: c iis x509certificate isapi


    【解决方案1】:

    我刚刚遇到了这个老问题。很抱歉没有早点看到。

    多年前,我编写了一个示例,展示了如何使用 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])
    

    Chain 对象构建证书链。如果不能使用 CAPICOM,可以使用 Crypto API 的 CertGetCertificateChain 函数获取证书链,但工作量更大。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 2018-08-15
      • 2013-11-20
      • 1970-01-01
      相关资源
      最近更新 更多