Пользовательский центр сертификации с .NET 8 и GRPC без установки корневого центра сертификацииC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Пользовательский центр сертификации с .NET 8 и GRPC без установки корневого центра сертификации

Сообщение Anonymous »

У меня есть приложение .NET, которое взаимодействует с приложением ASP.NET Core через GRPC, которое я пытаюсь защитить с помощью mTLS, используя самогенерируемые сертификаты.
Я сгенерировал следующие сертификаты:

Код: Выделить всё

- CustomCA
- Client1 Cert
- Client2 Cert
- Server Cert
и настроил обе стороны соединения для использования этих сертификатов, и это работает отлично, ЕСЛИ я устанавливаю свой собственный центр сертификации в доверенные корневые центры сертификации Windows store.
Учитывая, что эти сертификаты будут использоваться только для связи между приложениями (т. е. никогда не будет необходимости в браузере или управляемом пользователем приложении для связи с приложением ASP.NET Core). ), я хотел бы по возможности избежать установки нового доверенного центра сертификации и настроить собственное хранилище сертификатов на обоих концах моего приложения.
Мне удалось проверить свои сертификаты вручную с помощью пользовательская цепочка (т. е. caChain.Build(certificate) возвращает true

Код: Выделить всё

builder.WebHost.ConfigureKestrel(options =>
{
var caCert = new X509Certificate2("./certs/ca-cert.pfx");
var caChain = new X509Chain();
caChain.ChainPolicy.ExtraStore.Add(caCert);
caChain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;
caChain.ChainPolicy.VerificationFlags = X509VerificationFlags.AllowUnknownCertificateAuthority;

options.ConfigureHttpsDefaults(httpsOptions =>
{
httpsOptions.ClientCertificateMode = ClientCertificateMode.RequireCertificate;
httpsOptions.ServerCertificate = new X509Certificate2("./certs/server.pfx");
httpsOptions.ClientCertificateValidation = (certificate, chain, sslPolicyErrors) =>
{
if (sslPolicyErrors == SslPolicyErrors.None)
{
return true;
}

bool isValid = caChain.Build(certificate);

if (isValid)
{
return true;
}

Log.Error("Client certificate validation failed: {0}", sslPolicyErrors);
return false;
};
});
});
Однако OnAuthenticationFailed срабатывает в обратном вызове события сертификата.

Код: Выделить всё

builder.Services.AddAuthentication(CertificateAuthenticationDefaults.AuthenticationScheme)
.AddCertificate(options =>
{
var caCert = new X509Certificate2("./certs/ca-cert.pfx");
options.AllowedCertificateTypes = CertificateTypes.Chained;

options.ValidateCertificateUse = true;
options.ValidateValidityPeriod = true;
options.RevocationMode = X509RevocationMode.NoCheck;
options.AdditionalChainCertificates = new X509Certificate2Collection(caCert);
options.Events = new CertificateAuthenticationEvents
{
OnCertificateValidated = context =>
{
return Task.CompletedTask;
},
OnAuthenticationFailed = context =>
{
return Task.CompletedTask;
},
};
});
Я пытался заменить мой ClientCertificateValidation на (certificate, Chain, sslPolicyErrors) => true; эффективно отключил все проверки, но все равно нажал OnAuthenticationFailed
code> обратный вызов.
Единственный намек, который я нашел, это если я проверю цепочку в ClientCertificateValidation, я увижу, что элемент 0 (сертификат клиента) имеет элемент цепочки Статус 0, который, как я полагаю, означает, что он прошел успешную проверку, тогда как элемент 1 (CA) имеет статус UntrustedRoot и информацию о статусе

Цепочка сертификатов обработана, но завершена в корневом сертификате, которому не доверяет поставщик доверия.

Я предполагаю, что это означает, что цепочка была проверена, но потому что ничего доверяет моему пользовательскому ЦС, цепочка не проходит проверку.
Есть ли способ загрузить свой собственный ЦС в доверенное хранилище, специфичное для моего приложения?

Подробнее здесь: https://stackoverflow.com/questions/786 ... ng-root-ca
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»