Код: Выделить всё
- CustomCA
- Client1 Cert
- Client2 Cert
- Server Cert
Учитывая, что эти сертификаты будут использоваться только для связи между приложениями (т. е. никогда не будет необходимости в браузере или управляемом пользователем приложении для связи с приложением ASP), я' Я хотел бы по возможности избежать установки нового доверенного центра сертификации и настроить собственное хранилище сертификатов на обоих концах моего приложения.
Мне удалось проверить свои сертификаты вручную с помощью специальной цепочки (т. е. 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;
};
});
});
Код: Выделить всё
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;
},
};
});
code> обратный вызов.
Единственный намек, который я нашел, это если я проверю цепочку в ClientCertificateValidation, я увижу, что элемент 0 (сертификат клиента) имеет элемент цепочки Статус 0, который, как я предполагаю, означает, что он успешно проверен, тогда как элемент 1 (CA) имеет статус UntrustedRoot и информацию о состоянии. Цепочка сертификатов обработана, но завершена в корневом сертификате, которому не доверяет доверие. провайдер.. Я предполагаю, что это означает, что цепочка была проверена, но поскольку ничто не доверяет моему пользовательскому ЦС, цепочка не может проверить
Есть ли способ загрузить свой собственный ЦС в доверенное хранилище, специфичное для моего приложения ?
Подробнее здесь: https://stackoverflow.com/questions/786 ... ng-root-ca