#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;