C++ 使用C+从SChannel提取证书链+;和CryptoApi/SChannel

C++ 使用C+从SChannel提取证书链+;和CryptoApi/SChannel,c++,windows,ssl,cryptoapi,schannel,C++,Windows,Ssl,Cryptoapi,Schannel,是否可以在TLS 1.0握手中提取远程计算机发送的证书链 具有SECPKG_ATTR_REMOTE_CERT_上下文值的API QueryContextAttributes仅返回结束证书 是否可以使用某些方法提取所有链证书? 环境窗口和C++使用隐式API和Shannel. 谢谢 是的 将QueryContextAttributes()与SECPKG\u ATTR\u REMOTE\u CERT\u上下文一起使用,返回的服务器证书将hCertStore成员设置为包含所有服务器中间CA证书的证书存

是否可以在TLS 1.0握手中提取远程计算机发送的证书链

具有SECPKG_ATTR_REMOTE_CERT_上下文值的API QueryContextAttributes仅返回结束证书

是否可以使用某些方法提取所有链证书? 环境窗口和C++使用隐式API和Shannel.</P> 谢谢

是的

QueryContextAttributes()
SECPKG\u ATTR\u REMOTE\u CERT\u上下文一起使用,返回的服务器证书将
hCertStore
成员设置为包含所有服务器中间CA证书的证书存储。(见第页的备注。)

请参阅下面的代码片段(来源:WebClient.c,Microsoft Platform SDK),了解如何解析链:

静态
无效的
显示证书链(
PCCERT_上下文pServerCert,
布尔(牙垢)
{
CHAR szName[1000];
PCCERT_上下文PCcurrentCert;
PCCERT_证书;
DWORD dwVerificationFlags;
printf(“\n”);
//显示叶名称
如果(!CertNameToStr(pServerCert->dwCertEncodingType),
&pServerCert->pCertInfo->Subject,
CERT_X500_NAME_STR|CERT_NAME_STR_NO_PLUS_标志,
szName,sizeof(szName)))
{
printf(“****错误0x%x生成主题名称\n”,GetLastError());
}
如果(絮状)
{
printf(“客户主体:%s\n”,szName);
}
其他的
{
printf(“服务器主题:%s\n”,szName);
}
如果(!CertNameToStr(pServerCert->dwCertEncodingType),
&pServerCert->pCertInfo->发卡机构,
CERT_X500_NAME_STR|CERT_NAME_STR_NO_PLUS_标志,
szName,sizeof(szName)))
{
printf(“****错误0x%x生成颁发者名称\n”,GetLastError());
}
如果(絮状)
{
printf(“客户端颁发者:%s\n”,szName);
}
其他的
{
printf(“服务器颁发者:%s\n\n”,szName);
}
//显示证书链
pCurrentCert=pServerCert;
while(pCurrentCert!=NULL)
{
dwVerificationFlags=0;
PisuerCert=CertGetIssuerCertificateFromStore(pServerCert->hCertStore,
PCcurrentCert,
无效的
&dwVerificationFlags);
if(pisuercert==NULL)
{
if(pCurrentCert!=pServerCert)
{
CertFreeCertificateContext(PCcurrentCert);
}
打破
}
如果(!CertNameToStr(pIssuerCert->dwCertEncodingType,
&pIssuerCert->pCertInfo->Subject,
CERT_X500_NAME_STR|CERT_NAME_STR_NO_PLUS_标志,
szName,sizeof(szName)))
{
printf(“****错误0x%x生成主题名称\n”,GetLastError());
}
printf(“CA主题:%s\n”,szName);
如果(!CertNameToStr(pIssuerCert->dwCertEncodingType,
&pIssuerCert->pCertInfo->Issuer,
CERT_X500_NAME_STR|CERT_NAME_STR_NO_PLUS_标志,
szName,sizeof(szName)))
{
printf(“****错误0x%x生成颁发者名称\n”,GetLastError());
}
printf(“CA颁发者:%s\n\n”,szName);
if(pCurrentCert!=pServerCert)
{
CertFreeCertificateContext(PCcurrentCert);
}
pCurrentCert=pIssuerCert;
pIssuerCert=NULL;
}
}

MSDN链接似乎指向一个文档页面,该页面仅描述了
QueryContextAttributes()
的CredSSP版本。有关Schannel版本,请参见。