I need to trust some self-signed certificates in the application, so I override validation callback like this:
ServicePointManager.ServerCertificateValidation
The @pete.c's solution seems to work correctly (checked different cases)
However, if still unsure that X509CertificateValidator validates the same way, the default callback can be run through reflection:
private static object s_defaultCallback;
private static MethodInfo s_defaultCallbackInvoker;
...
// Get the original callback using reflection
PropertyInfo[] pis = typeof (ServicePointManager).GetProperties(BindingFlags.Static | BindingFlags.NonPublic);
foreach (var pi in pis)
{
if (pi.Name == "CertPolicyValidationCallback")
{
s_defaultCallback = pi.GetValue(null, null);
s_defaultCallbackInvoker = s_defaultCallback.GetType().GetMethod("Invoke", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
break;
}
}
...
private static bool CertificateValidationCallBack(
object sender,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors)
{
// Your custom check here...
if (isYourSpecialCase)
{
return true;
}
// Default Windows behavior
WebRequest req = sender as WebRequest;
if (req == null)
return false;
ServicePoint sp = ServicePointManager.FindServicePoint(req.RequestUri);
string host = req.RequestUri.Host;
object [] parameters = new object[]
{
host,
sp,
certificate,
req,
chain,
sslPolicyErrors
};
return (bool)s_defaultCallbackInvoker.Invoke(s_defaultCallback, parameters);
}