Проблема с использованием двусторонней TLS в ядре asp.net с самозаверяющими сертификатами, созданными в XCA - PullRequest
0 голосов
/ 25 октября 2018

Я пытался настроить двухсторонний 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, серверсертификат кажется действительным.

Мне не хватает конфигурации для сертификатов или это связано с ошибкой в ​​моем коде?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...