.NET Core при добавлении клиентского сертификата в POST к KESTREL REST API в Linux не проходит проверку сертификата сервера - PullRequest
4 голосов
/ 28 мая 2019

Я использую .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» и отклоняет запрос.

Любой имеет любойидеи пожалуйста?

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

мы также столкнулись с той же проблемой, для Linux Ubuntu OS с Apache Server.мы решили это, прикрепив сертификат SSL.с Apache Config.

0 голосов
/ 30 мая 2019

Оказывается, это действительно работает! Мне просто нужно было получить правильные сертификаты на месте!

В частности, я должен был включить Root CA и Intermediate CA на стороне сервера.
Клиентская сторона, я должен был включить только Root CA для проверки.

...