В .NET Core 2.1 вы можете установить обработчик RemoteCertificateValidationCallback
для проверки сертификата TLS сервера. Подпись обратного вызова задокументирована , но неясно, как ее использовать. Существует перечисление SslPolicyErrors
, которое предоставляет значения для некоторых потенциальных ошибок проверки, но не всех. Например, в чем будет ошибка, если срок действия сертификата истек? Кроме того, какие дополнительные проверки будет выполнять реализация по умолчанию, и будут ли они по-прежнему применяться при использовании моего обратного вызова?
Я хочу изменить подтверждение двумя способами:
Если сертификат обычно действителен, я хочу ограничить сертификат, любую цепочку или сертификат CA указанным хешем. Поэтому я могу ограничить сертификаты или CA, используемые сервером. В этом случае будут обнаружены SSL-прокси.
Если сертификат или ЦС самоподписан и обычно не принимается, я все равно хочу его принять, если хеш совпадает. В этом случае SslPolicyErrors
, вероятно, имеет значение, отличное от None
.
В любом случае название сертификата и срок его действия должны быть правильными. Я не собираюсь отменять это. У меня есть только веб-сервер с неправильным именем сертификата для тестирования (устанавливает SslPolicyErrors.RemoteCertificateNameMismatch
), но ни один с устаревшим сертификатом.
Как бы это было сделано в C #?
Это метод скелета:
private bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return certificate.GetCertHashString(HashAlgorithmName.SHA256) == "12345...";
}
Я еще не уверен насчет алгоритма хеширования. SHA-1 по умолчанию, вероятно, больше не подходит и может даже не существовать. Мне придется играть больше, когда основы сделаны.