У меня есть root сертификат и лист. Лист имеет расширение OID URL CRL, которое указывает на действительное местоположение в сети. При этом:
certutil -verify .\leaf.cer
завершается неудачно с
ОШИБКА: возвращено подтверждение состояния отзыва сертификата листа Функция отзыва не смогла проверить отзыв, поскольку сервер отзыва был отключен. 0x80092013 (-2146885613 CRYPT_E_REVOCATION_OFFLINE)
Если я сделаю это:
certutil -verify .\leaf.cer .\root.cer
Затем проверка проходит, и я вижу, что CRL извлекается из сети в Fiddler.
В моем C# коде я делаю это:
X509Chain childCertChain = new X509Chain();
childCertChain.ChainPolicy.ExtraStore.Add(rootCert);
childCertChain.ChainPolicy.RevocationMode = X509RevocationMode.Online;
childCertChain.ChainPolicy.UrlRetrievalTimeout = TimeSpan.FromSeconds(10);
if (!childCertChain.Build(childCert))
{
// The root cert is not in the windows certificate store, that is fine
if (childCertChain.ChainStatus.Length != 1 || childCertChain.ChainStatus.First().Status != X509ChainStatusFlags.UntrustedRoot)
{
throw new Exception("Certificate validation error.");
}
}
Это ударит по моему исключению, и хотя chainElements будет правильно заполнен 2 сертификатами, ChainStatus покажет:
OfflineRevocation, RevocationStatusUnknown
Я также не увижу никаких веб-запросов в Fiddler. Я могу программно загрузить CRL по URL, так что это не моя среда отладки AFAIK. Любые идеи, как получить x509Chain.Build для успеха?