Как интерпретировать SSLPolicyErrors для проверки запросов Https с помощью DANE - PullRequest
0 голосов
/ 04 августа 2020

В настоящее время я работаю над проектом, в котором мне нужно проверять запросы Https на основе известных записей TLSA. Шаги следующие:

  1. Я выполняю поиск в DNS и получаю все записи TLSA домена
  2. Я выполняю запрос Https и использую ServicePointManager.ServerCertificateValidationCallback для проверки
  3. Получив подтверждение сертификата, я следую DANE rf c для проверки запроса HTTPS:
  4. На основе записи TLSA CertificateUsage правильный сертификат в цепочка выбрана.

На этом этапе у меня возникает следующая проблема. В разделе 5 RF c указано, что для различные типы использования сертификатов (например, PKIX-TA (0), PKIX-EE (1), DANE-TA (2) и DANE-EE (3)), цепочка сертификатов должна быть аутентифицирована разными способами.

Насколько я понимаю, эта аутентификация основана на SSLPolicyErrors, но я изо всех сил пытаюсь перевести язык rf c в SSLPolicyErrors. В настоящее время я реализовал это следующим образом на основе комбинации ARSoft.Tools. Net и rf c:

  • для обоих значений PKIX (0 и 1), любые ошибки политики будут означать, что сертификат недействителен.
  • Для Dane-TA (2) указано, что With usage DANE-TA(2), the server certificates will need to have names that match one of the client's reference identifiers. Я перевел это так: значение перечисления несовпадения имен недопустимо
  • Для Dane-EE (3) указано, что Authentication via certificate usage DANE-EE(3) TLSA records involves simply checking that the server's leaf certificate matches the TLSA record.. Я перевел это на: Разрешены любые типы ошибок политики SSL.

Это подводит меня к следующему коду:

        public IEnumerable<SystemX509Certificates.X509Certificate> GetCorrectCertificate(SystemX509Certificates.X509Certificate certificate, X509Chain certificateChain, SslPolicyErrors sslPolicyErrors)
        {
            switch (_tlsaRecord.CertificateUsage)
            {
                case 0: // PKIX-TA, the full certificate chain needs to be valid
                    if(sslPolicyErrors == SslPolicyErrors.None)
                    {
                        // use any certificate
                        return certificateChain.ChainElements.Cast<X509ChainElement>().Select(x => x.Certificate);
                    }
                    else
                    {
                        return null;
                    }
                case 1: //PKIX-EE, the full certificate chain needs to be valid
                    if (sslPolicyErrors == SslPolicyErrors.None)
                    {
                        // use end entity certificate
                        return Enumerable.AsEnumerable(new List<SystemX509Certificates.X509Certificate> { certificate });
                    }
                    else
                    {
                        return null;
                    }
                case 2: //DANE-TA, only name mismatch is not allowed
                    if ((sslPolicyErrors | SslPolicyErrors.RemoteCertificateChainErrors) == SslPolicyErrors.RemoteCertificateChainErrors)
                    {
                        // use any certificate
                        return certificateChain.ChainElements.Cast<X509ChainElement>().Select(x => x.Certificate);
                    }
                    else
                    {
                        return null;
                    }
                case 3: //DANE-EE, only compare leaf certificate with TLSA record
                        // use end entity certificate
                        return Enumerable.AsEnumerable(new List<SystemX509Certificates.X509Certificate> { certificate });
                default:
                    return Enumerable.Empty<X509Certificate2>();
            }
        }

Однако я не знаю, насколько моя интерпретация RF c и реализация C# верны. Может ли кто-нибудь сказать мне, выполняю ли я правильную проверку политики SSL для различных типов использования сертификатов TLSA?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...