我想使用C++在Win32中验证SSL证书。我想我想使用Cert * API,这样我就可以获得Windows证书存储的好处。这是我想出来的。在Win32中验证SSL证书的正确方法是什么?
- 它是正确的吗?
- 有没有更好的方法来做到这一点?
- 我做错了什么?
bool IsValidSSLCertificate(PCCERT_CONTEXT certificate, LPWSTR serverName)
{
LPTSTR usages[] = { szOID_PKIX_KP_SERVER_AUTH };
CERT_CHAIN_PARA params = { sizeof(params) };
params.RequestedUsage.dwType = USAGE_MATCH_TYPE_AND;
params.RequestedUsage.Usage.cUsageIdentifier = _countof(usages);
params.RequestedUsage.Usage.rgpszUsageIdentifier = usages;
PCCERT_CHAIN_CONTEXT chainContext = 0;
if (!CertGetCertificateChain(NULL,
certificate,
NULL,
NULL,
¶ms,
CERT_CHAIN_REVOCATION_CHECK_CHAIN,
NULL,
&chainContext))
{
return false;
}
SSL_EXTRA_CERT_CHAIN_POLICY_PARA sslPolicy = { sizeof(sslPolicy) };
sslPolicy.dwAuthType = AUTHTYPE_SERVER;
sslPolicy.pwszServerName = serverName;
CERT_CHAIN_POLICY_PARA policy = { sizeof(policy) };
policy.pvExtraPolicyPara = &sslPolicy;
CERT_CHAIN_POLICY_STATUS status = { sizeof(status) };
BOOL verified = CertVerifyCertificateChainPolicy(CERT_CHAIN_POLICY_SSL,
chainContext,
&policy,
&status);
CertFreeCertificateChain(chainContext);
return verified && status.dwError == 0;
}
你没有提到你使用的是什么,但是,如果你在典型的HTTPS场景中使用它,通常应该传递CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT。 – EricLaw
我主要想用它来验证LDAP服务器SSL证书(比如,在VERIFYSERVERCERT函数中)。我也想用它来验证客户端/服务器应用程序中的HTTPS服务器证书,客户端可以为服务器指定自己的SSL证书。 – briangreenery
使用CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT而不是CERT_CHAIN_REVOCATION_CHECK_CHAIN更常见吗?你为什么不检查根证书的撤销? – briangreenery