Идентифицируется, если сертификат является хостом, промежуточным сертификатом или сертификатом root - PullRequest
1 голос
/ 09 апреля 2020

Мне нужен способ, учитывая список объектов X509Certificate2, классифицировать каждый из них как root, промежуточный сертификат или сертификат узла.

У меня запущена служба TCP в docker контейнер на AWS. Я установил систему секретного управления и внешнюю систему обеспечения для предоставления сертификатов этой службе для TLS. Тем не менее, сертификаты являются PEM, и это ужасно больно в c#. После пяти попыток за последние 8 лет даже загрузить сертификаты PEM, когда задействован закрытый ключ, я наконец решил эту проблему чисто с помощью некоторого нового синтаксиса, предоставленного в ядре do tnet. Итак, да.

Теперь у моего приложения есть сертификаты с закрытыми ключами и цепочкой, но они все еще не могут их использовать из-за интерфейса метода AuthenticateAsServer, который не позволяет вам предоставлять цепочку. Скорее вы предоставляете сертификат, а затем он выкопает цепочку из хранилища сертификатов, если это возможно, а затем вам нужно посмотреть на другом конце, чтобы увидеть, вышла ли цепочка. (Я избавлю вас от долгих часов тирады моих чувств по поводу этого шаблона) Поскольку я не могу предоставить цепочку, мой единственный вариант - установить цепочку до вызова AuthenticateAsServer, чтобы супер непрозрачный черный ящик нашел их и отправьте их.

Вот проблема. Моя цепочка - это большая строка, которую вы можете получить, собирая вместе соответствующие файлы сертификатов, созданные в OpenSSL. Я уже написал некоторый код, чтобы разбить этот текст на куски сертификатов, а затем инициализировать коллекцию объектов X509Certificate2, через которую я могу выполнить поиск, и установить каждый из них в хранилище. Но в каком магазине? Мне нужен способ проверить каждый из них и узнать, в каком хранилище он должен go.

Вот моя рабочая идея в psuedocode

bool isSelfSigned = cert.Issuer == cert.Subject;
bool isCa = HasBasicConstraintCA();

if (isCa)
{
   if (isSelfSigned) root=true;
   else intermediate=true;
}
else if(some hopefully affirmative condition)
{
   host=true;
}

Это разумно, учитывая ситуацию? Собираюсь ли я поразить любые неожиданные ловушки этой логикой c?

Есть ли какие-либо утвердительные условия, которые я могу проверить для сертификата хоста, кроме тех, которые не являются ни двумя другими?

1 Ответ

1 голос
/ 13 апреля 2020

Ваш лог c почти правильный; Обратите внимание, что для сертификатов конечных объектов (в вашем терминальном сертификате хоста) возможны следующие значения:

  1. отсутствует флаг basicConstraint
  2. basicConstraint: CA: False присутствует

В обоих вышеупомянутых случаях это может интерпретироваться как сертификаты конечного объекта (хоста). Пожалуйста, убедитесь, что ваша функция HasBasicConstraintCA () проверяет оба случая. Помимо логика c выглядит просто и замечательно.

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