Как интерпретировать SSLPolicyErrors для проверки запросов Https с помощью DANE
В настоящее время я работаю над проектом, в котором мне нужно проверять запросы Https на основе известных записей TLSA. Шаги следующие:
- Я выполняю поиск в DNS и получаю все записи TLSA домена
- Я выполняю запрос Https и использую
ServicePointManager.ServerCertificateValidationCallback
для выполнения проверки - Получив подтверждение сертификата, я следую DANE rfc для проверки запроса HTTPS:
- На основе записи 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?