Код: Выделить всё
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;
Это работает. Но у меня есть несколько сообщений о том, что проверка не удалась в корпоративных средах. Проблема возникает, когда цепочка сертификатов заменяется корпоративным брандмауэром. Для PolicyStatus.dwError установлено значение 800B0109 = CERT_E_UNTRUSTEDROOT.
Но другие приложения могут подключаться к моему веб-сайту:
- Пользователи могут подключаться к моему веб-сайту с помощью своих веб-браузеров (но я знаю, что у них есть собственное хранилище доверенных сертификатов, поэтому для меня это не так уж удивительно).
- Но пользователи также могут подключаться с помощью 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
Мобильная версия