HttpClientHandler.ServerCertificateCustomValidationCallback не выдает исключения, когда неверен publickey

#c# #xamarin.forms #ssl-certificate

#c# #xamarin.forms #ssl-сертификат

Вопрос:

Я делаю это в формах Xamarin, используя C #, за которым следует этот пример https://github.com/chrisriesgo/xamarin-cert-pinning/tree/master/PinCerts .

ШАГ-1

 public static class SSLValidator
{
    static string PUBLIC_KEY = "MYPUBLICKEY";
    public static void Initialize()
    { 
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
        ServicePointManager.ServerCertificateValidationCallback = OnValidateCertificate;
    }
    static bool OnValidateCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
        var certPublicString = certificate?.GetPublicKeyString();
        var keysMatch = PUBLIC_KEY == certPublicString;
        return keysMatch;
    }
}
  

ШАГ — 2

Вызов этого класса в App.cs

 SSLValidator.Initialize();
  

ШАГ — 3

 Calling in Android MainActivity OnCreate

ServicePointManager.ServerCertificateValidationCallback  = (o, cert, chain, errors) => true;
  

ШАГ — 4

 Finally my RestService Class

    private HttpClient getClient()
    {
        var httpClientHandler = new HttpClientHandler();

        if (Device.RuntimePlatform == Device.Android)
        {
            httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true; 
        }
        HttpClient client = new HttpClient(httpClientHandler)
        {
            BaseAddress = new Uri(Constants.RestBaseUrl)
        };
        return client;
    }
  

Проблема: несмотря на то, что мой открытый ключ неверен, приведенный ниже код не выдает исключения.

 httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true; 
  

Комментарии:

1. Вы регистрируете правильный обработчик, затем обработчик «все работает». Работает ли это лучше, если вы оставите тот, в котором вы всегда возвращаете true? (Если вам нужно зарегистрировать его в экземпляре, как на шаге 4, зарегистрируйте статический SSLValidator . OnValidateCertificate)

2. вы хотите сказать, явно вызвать SSLValidator . OnValidateCertificate()?. OnValidateCertificate() — это метод обратного вызова для ServerCertificateValidationCallback .

3. Удалить ServicePointManager.ServerCertificateValidationCallback = (o, cert, chain, errors) => true; и заменить httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true; на httpClientHandler.ServerCertificateCustomValidationCallback = SSLValidator.OnValidateCertificate;