7

I want to modify .Net's default ServerCertificateValidationCallback to validate as true some of my company's certificates, but keeping the default validation for other certificates.

I can't seem to do this since the default ServerCertificateValidationCallback value is null.

ServicePointManager.ServerCertificateValidationCallback = 
(sender, certificate, chain, sslPolicyErrors) => 
 validCertificatesSerialNumbers.Contains(certificate.GetSerialNumberString()) ||    
 defaultlCallback.Invoke(sender, certificate, chain, sslPolicyErrors) //How do I set defaultCallback?
;

Thank you

Joanvo
  • 5,677
  • 2
  • 25
  • 35
  • 2
    From what I can tell, [the validation has already been done](http://referencesource.microsoft.com/#System/net/System/Net/ServicePoint.cs,1036) and all that is needed is to check that `sslPolicyErrors == SslPolicyErrors.None`. – Mike Zboray Feb 23 '15 at 17:15
  • Cool, would you set it as an answer? – Joanvo Feb 23 '15 at 17:16

1 Answers1

15

From what I can tell in the reference source this is where the callback comes into play:

if (ServicePointManager.ServerCertificateValidationCallback != null)
{
    useDefault = false;
    return ServicePointManager.ServerCertValidationCallback.
                               Invoke(m_Request,
                                      certificate,
                                      chain,
                                      sslPolicyErrors);
}

if (useDefault)
    return sslPolicyErrors == SslPolicyErrors.None;

Which means that the validation has already been performed and to know whether it passes you just need to check the sslPolicyErrors argument. You would do this:

ServicePointManager.ServerCertificateValidationCallback = 
(sender, certificate, chain, sslPolicyErrors) => 
validCertificatesSerialNumbers.Contains(certificate.GetSerialNumberString()) || (sslPolicyErrors == SslPolicyErrors.None);
Mike Zboray
  • 39,828
  • 3
  • 90
  • 122