Мне нужен способ, учитывая список объектов 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?
Есть ли какие-либо утвердительные условия, которые я могу проверить для сертификата хоста, кроме тех, которые не являются ни двумя другими?