Я использую .NET Core 2.1, Kestrel в Linux.
Мое веб-приложение, действующее в качестве клиента, отправляет запрос следующим образом (следующие инструкции разбиты на части, похоже, так и будет):
var handler = new HttpClientHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
X509Certificate2 cert = GetClientCertificate();
handler.ClientCertificates.Add(cert);
using (var client = new HttpClient(handler))
{
var myRequest= new myRequest()
{
foo = bar,
};
var response = await client.PostAsync(myUrl, myRequest, new JsonMediaTypeFormatter());
Я настроил Kestrel следующим образом:
return WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel(options =>
{
options.Listen(IPAddress.Any, 443, listenOptions =>
{
var httpsConnectionAdapterOptions = new HttpsConnectionAdapterOptions()
{
ClientCertificateMode = ClientCertificateMode.RequireCertificate,
SslProtocols = System.Security.Authentication.SslProtocols.Tls12,
ServerCertificate = GetSSLCertificate(),
ClientCertificateValidation = CertificateValidator.MyCustomerValidatorForLogging
};
listenOptions.UseHttps(httpsConnectionAdapterOptions);
});
}
)
.Build();
Я добавил специальный валидатор (просто чтобы посмотреть, что происходит, выглядит так):
public static bool MyCustomerValidatorForLogging(X509Certificate2 certificate, X509Chain chain, SslPolicyErrors errors)
{
Log.Info("Received Request");
Log.Error(errors.ToString());
if (errors == SslPolicyErrors.None)
{
return true;
}
return false;
}
GetClientCertificate () - это сертификат для SSL-сертификата проверки подлинности клиента, подписанный промежуточным ЦС.
GetSSLCertificate () - это сертификат для SSL-сертификата стандартной проверки подлинности сервера.
Я скопировал выдающий дополнительный ЦСи CA-сертификаты клиента аутентифицируют в / usr / local / share / ca-сертификаты / ("store") и выдают команду "update-ca-сертификаты".Я полагаю, что именно эти сертификаты используются для проверки сертификата клиента.
Когда сервер получает запрос, значение ошибки: «RemoteCertificateChainErrors» и отклоняет запрос.
Любой имеет любойидеи пожалуйста?