我想使用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