Отложенный запрос сертификата клиента (nginx)

Рейтинг: 0Ответов: 0Опубликовано: 20.01.2023

Nginx 1.14.1. Необходима аутентификация на клиентских сертификатах, но не для всего сайта (https://example.net), или приложения на нем (https://example.net/app1), а только по определенному пути в приложении (https://example.net/app1/auth/smartcard). Приложение на Net6 (c#, asp.net). При отладке используя сервер kestrel, без без обратного прокси-сервера nginx, я этого добился путем указания опции ClientCertificateMode.DelayCertificate:

 public static IHostBuilder CreateHostBuilder(string[] args, IConfiguration config) =>
           Host.CreateDefaultBuilder(args)
               .ConfigureWebHostDefaults(webBuilder =>
               {
                   webBuilder.UseConfiguration(config)
                   .UseStartup<Startup>()
                   .ConfigureKestrel(serverOptions =>
                   {
                       var connectionOptions = new HttpsConnectionAdapterOptions();
                    
                       // Отложенный запрос сертификата клиента.
                       connectionOptions.ClientCertificateMode = ClientCertificateMode.DelayCertificate;
                       // ...
                       serverOptions.Listen(IPAddress.Any, 15126, listenOptions =>
                       {
                           listenOptions.UseHttps(connectionOptions);
                       });
                    })
               });

Теперь, при обращении к https://localhost:15126, сертификат клиента не запрашивается. А при обращении к https://localhost:15126/auth/smartcard - запрашивается:

[Authorize(Policy = "SmartCardPolicy", AuthenticationSchemes = CertificateAuthenticationDefaults.AuthenticationScheme)]
[RequireHttps]
public async Task<IActionResult> SmartCard(string returnUrl = null)
{
}

Когда я публикую приложение app1 на сервере, и указываю в /etc/nginx/sites-available/default только

location /app1 {
    #...
    proxy_set_header  X-SSL-CERT $ssl_client_escaped_cert;
    #...
}

То сертификат клиента не запрашивается ни при открытии https://example.net, ни при https://example.net/app1, ни при https://example.net/app1/auth/smartcard

Если я укажу в файле /etc/nginx/sites-available/default в директиве server опции

ssl_client_certificate /path-ca.pem;
#ssl_verify_client on;
#ssl_verify_client optional;
ssl_verify_client optional_no_ca;

то запрос сертификата будет просто при открытии https://example.net/, равно как и https://example.net/app1, https://example.net/app2, https://example.net/appN. Я пробовал изменять значение параметра ssl_verify_client в "on", "optional" и "optional_no_ca", ожидая что хотя бы одна из этих опций разрешить принимать сертификат клиента, но при этом не отправлять клиенту запрос на сертификат (как это делает ClientCertificateMode.DelayCertificate в kestrel), однако запрос на сертификат выходит всегда.

Приложение app1 - это сервис, поддерживающий несколько типов аутентификации. Важно, чтобы при его посещении (или других приложений на https://example.net), запрос сертификата выдавался только в определенной точке. Как этого добиться через nginx? Я могу опубликовать app1 самостоятельно, без обратного прокси, но это небезопасно, т.к. kestrel нужно прятать.

Ответы

Ответов пока нет.