Мне нужно доверять некоторым самозаверяющим сертификатам в приложении, поэтому я переопределяю обратный вызов проверки следующим образом:
ServicePointManager.ServerCertificateValidationCallback = MyRemoteCertificateValidationCallback;
...
public static bool MyRemoteCertificateValidationCallback(
Object sender,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors)
{
if (sslPolicyErrors == SslPolicyErrors.None)
return true;
if (IsAprrovedByMyApplication(sender, certificate)) // <-- no matter what the check here is
return true;
else
return false; // <-- here I'd like to call the default Windows handler rather than returning 'false'
}
Но когда возникают некоторые ошибки политики и сайт, к которому я подключаюсь, не одобрен приложением, выдается исключение. Проблема здесь в том, что оно отличается от стандартного поведения Windows.
Рассмотрим этот сайт: https://www.dscoduc.com/
У этого сертификата неизвестный издатель, поэтому он ненадежен. Я добавил его с помощью MMC в список доверенных лиц локального компьютера (это Windows 7).
Если я запустил этот код без отмены обратного вызова проверки сертификата:
HttpWebRequest http = (HttpWebRequest)HttpWebRequest.Create("https://www.dscoduc.com/");
using (WebResponse resp = http.GetResponse())
{
using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
{
string htmlpage = sr.ReadToEnd();
}
}
он соединяется успешно. Это означает, что валидатор Windows по умолчанию решил доверять этому сертификату.
Но как только я переопределяю ServerCertificateValidationCallback, мой обратный вызов вызывается с помощью SslPolicyErrors.RemoteCertificateChainErrors, и цепочка содержит один элемент со статусом X509ChainStatusFlags.PartialChain (на самом деле я не ожидал получить никаких ошибок) здесь, потому что текущему сертификату следует доверять)
Этот сайт не включен в мой список доверенных, и он не хочет возвращать «истина» из моего обратного вызова. Но я тоже не хочу возвращать false, иначе я получу исключение: удаленный сертификат недействителен в соответствии с процедурой проверки, что, очевидно, не ожидается для https://www.dscoduc.com/, потому что он добавлен в хранилище доверенных лиц и одобрен Windows, если обратный вызов сертификата не отменен. Поэтому я хочу, чтобы Windows использовала процедуру проверки по умолчанию для этого сайта. Я не хочу сам заглядывать в доверенные хранилища Windows и перебирать все элементы цепочки, потому что это уже (и, надеюсь, правильно) реализовано в Windows.
Другими словами, мне нужно явно доверять сайтам, одобренным пользователем (которые хранятся где-то в его настройках), и вызывать проверку сертификации по умолчанию для всех остальных.
Значение по умолчанию для ServicePointManager.ServerCertificateValidationCallback равно нулю, поэтому мне не нужен обратный вызов по умолчанию, чтобы я мог позвонить позже. Как мне вызвать этот обработчик сертификатов по умолчанию?