Como chamar a verificação de certificado padrão ao substituir ServicePointManager.ServerCertificateValidationCallback em C #?

Preciso confiar em alguns certificados autoassinados no aplicativo, então substituo o retorno de chamada de validação assim:

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 Windwos handler rather than returning 'false'
}

Mas quando há alguns erros de política e o site ao qual estou me conectando não é aprovado por aplicativo, a exceção é lançada. O problema aqui é que ele difere do comportamento padrão do Window

Considere este site:https: //www.dscoduc.com

Seu certificado possui um emissor desconhecido e, portanto, não é confiável. Adicionei o MMC ao Trusted People do Copmuter local (é o Windows 7).

Se eu executar esse código sem substituir o retorno de chamada da validação de certificado:

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();
    }
}

it se conecta com sucesso. Isso significa que o validador padrão do Windows decidiu confiar neste certificad

Mas assim que eu substituir o ServerCertificateValidationCallback, meu retorno de chamada será chamado com SslPolicyErrors.RemoteCertificateChainErrors e a cadeia contém um elemento com status X509ChainStatusFlags.PartialChain (na verdade, eu esperaria não receber erros aqui, porque o certificado atual deve ser confiável)

Este site não está incluído na minha lista confiável e não deseja retornar 'true' do meu retorno de chamada. Mas também não quero retornar 'false', ou receberei uma exceção: "O certificado remoto é inválido de acordo com o procedimento de validação", o que obviamente não é esperado parahttps: //www.dscoduc.com, porque é adicionado à loja Trusted People e é aprovado pelo Windows quando o retorno de chamada do certificado não é substituído. Então, eu quero que o Windows execute o procedimento de validação padrão para este site. Não quero pesquisar nas lojas do Windows Trusted e analisar todos os elementos da cadeia, porque ela já (e espero que corretamente) foi implementada no Window

Em outras palavras, preciso confiar explicitamente nos sites aprovados pelo usuário (que estão armazenados em algum lugar nas configurações dele) e chamar a verificação de certificação padrão para todos os outro

O valor padrão para ServicePointManager.ServerCertificateValidationCallback é nulo; portanto, não há retorno de chamada 'padrão' para eu ligar mais tarde. Como devo chamar esse manipulador de certificado 'padrão'?

Obrigad

questionAnswers(6)

yourAnswerToTheQuestion