получить цепочку сертификатов клиента из запроса ISAPI - PullRequest
4 голосов
/ 10 февраля 2012

Я бы хотел получить всю цепочку сертификатов клиента из запроса в 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.

1 Ответ

0 голосов
/ 17 июля 2012

Я только что наткнулся на этот старый вопрос. Извините, я не видел это раньше.

Много лет назад я написал пример, который показывает, как это сделать с помощью CAPICOM. К сожалению, CAPICOM постепенно прекращается Microsoft, хотя она все еще работает.

Я нашел старый образец 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, вы можете получить цепочку сертификатов с помощью функции CertGetCertificateChain API Crypto, но это больше работы.

...