How to call the default certificate check when overriding ServicePointManager.ServerCertificateValidationCallback in C#?

前端 未结 3 1328
死守一世寂寞
死守一世寂寞 2021-01-01 18:43

I need to trust some self-signed certificates in the application, so I override validation callback like this:

ServicePointManager.ServerCertificateValidation         


        
3条回答
  •  没有蜡笔的小新
    2021-01-01 19:26

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

提交回复
热议问题