Я пытался настроить двухсторонний TLS с ядром asp.net, используя сертификаты, созданные с помощью XCA.
Сначала я создал корневой сертификат.
- Выбранный ЦС-Template
- Generate
Затем я сгенерировал сертификат сервера:
- Выбранный корневой сертификат для его подписи
- Выбранный шаблон HTTPS_Server
- Введенное альтернативное имя субъекта: IP: 127.0.0.1
- Генерировать
- Экспорт в p12
Затем я сгенерировал сертификат клиента:
- Выбранный корневой сертификат для его подписи
- Выбранный шаблон HTTPS_Client
- Создание
- Экспорт в p12
Настройка сервера Kestrel:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseKestrel(options =>
{
options.ConfigureHttpsDefaults(confOptions => {
confOptions.ClientCertificateMode = Microsoft.AspNetCore.Server.Kestrel.Https.ClientCertificateMode.RequireCertificate;
confOptions.CheckCertificateRevocation = true;
confOptions.SslProtocols = System.Security.Authentication.SslProtocols.Tls12;
confOptions.ServerCertificate = new X509Certificate2("servercertificate.p12", "password");
}
);
options.Listen(IPAddress.Loopback, 5001, listenOptions =>
{
listenOptions.UseHttps();
});
})
.UseStartup<Startup>();
}
Использовать HttpClient из другой программы:
var cert = new X509Certificate2("clientcertificate.p12", "password");
var _clientHandler = new HttpClientHandler();
_clientHandler.ClientCertificateOptions = ClientCertificateOption.Manual;
_clientHandler.ClientCertificates.Add(cert);
_clientHandler.SslProtocols = System.Security.Authentication.SslProtocols.Tls12;
HttpClient client = new HttpClient(_clientHandler);
client.BaseAddress = new System.Uri("https://127.0.0.1:5001");
var result = "";
try {
result = client.GetStringAsync("api/values").GetAwaiter().GetResult();
} catch (Exception e) {
Console.WriteLine(e.InnerException);
}
Когда клиент подключается, сервер отклоняет подключение.Сервер выводит в консоль следующее:
Failed to authenticate HTTPS connection.
System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
Если я отключаю проверку сертификата клиента на сервере, добавляю корневой открытый сертификат в хранилище сертификатов и указываю моему браузеру 127.0.0.1, серверсертификат кажется действительным.
Мне не хватает конфигурации для сертификатов или это связано с ошибкой в моем коде?