Как интерпретировать SSLPolicyErrors для проверки запросов Https с помощью DANE

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

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

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

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

  • Для обоих значений 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>();
            }
        }

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

0 ответов

Другие вопросы по тегам