Пример кода, который проверяет сертификат на соответствие системному хранилищу сертификатов Windows (для краткости проверка ошибок была удалена) :
Код: Выделить всё
const CERT_CONTEXT * CertContext =
CertCreateCertificateContext(
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, Certificate, Len);
CERT_CHAIN_PARA ChainPara;
memset(&ChainPara, 0, sizeof(ChainPara));
ChainPara.cbSize = sizeof(ChainPara);
CERT_CHAIN_ENGINE_CONFIG ChainConfig;
memset(&ChainConfig, 0, sizeof(ChainConfig));
ChainConfig.cbSize = sizeof(ChainConfig);
ChainConfig.dwFlags = CERT_CHAIN_CACHE_END_CERT;
HCERTCHAINENGINE ChainEngine;
CertCreateCertificateChainEngine(&ChainConfig, &ChainEngine);
const CERT_CHAIN_CONTEXT * ChainContext = NULL;
CertGetCertificateChain(
ChainEngine, CertContext, NULL, NULL, &ChainPara,
CERT_CHAIN_CACHE_END_CERT | CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT,
NULL, &ChainContext);
CERT_CHAIN_POLICY_PARA PolicyPara;
PolicyPara.cbSize = sizeof(PolicyPara);
CERT_CHAIN_POLICY_STATUS PolicyStatus;
PolicyStatus.cbSize = sizeof(PolicyStatus);
CertVerifyCertificateChainPolicy(
CERT_CHAIN_POLICY_SSL, ChainContext, &PolicyPara, &PolicyStatus);
int PolicyError = PolicyStatus.dwError;
Как предложил @bartonjs, я также пробовал использовать HCCE_CURRENT_USER > (=
Код: Выделить всё
NULLНо другие приложения могут подключаться к моему веб-сайту:
- Пользователи могут подключаться к моему веб-сайту с помощью своих веб-браузеров (но я знаю, что у них есть собственное хранилище доверенных сертификатов, поэтому для меня это не так уж удивительно).
- Но пользователи также могут подключаться используя Invoke-WebRequest в PowerShell.
- И сертификат моего сайта также успешно проверен с использованием .NET X509Chain.Build (я предполагаю, что происходит внутри Invoke- WebRequest):
Код: Выделить всё
X509Chain chain = new();
chain.Build(sslStream.RemoteCertificate);
// chain.ChainStatus is now empty => certificate is valid
Кто-нибудь знает, что .NET делает по-другому, что он может успешно проверять замененную цепочку сертификатов?
Подробнее здесь: https://stackoverflow.com/questions/785 ... n-the-cert
Мобильная версия