Как использовать HTTPS / SSL с Kestrel в ASP.NET Core 2.x?

В настоящее время я использую ASP.NET Core 2.x, и я имел обыкновение заставлять Kestrel использовать HTTPS / SSL, просто помещая его в UseUrls() метод вроде так:

var host = new WebHostBuilder()
    .UseUrls("http://localhost", "https://111.111.111.111")
    .UseKestrel()
    .Build();

Но теперь я получаю исключение:

 System.InvalidOperationException:
     HTTPS endpoints can only be configured using KestrelServerOptions.Listen().

Как настроить Kestrel для использования SSL в ASP.NET Core 2.x?

2 ответа

Решение

Основы. Использование URL-адресов сервера

Если вы хотите связать свой сервер с использованием всех IP-адресов, назначенных серверу / веб-хосту, то вы можете сделать это:

WebHost.CreateDefaultBuilder(args)
    .UseUrls("http://localhost:5000", "http://*:80")
    .UseStartup<Startup>()
    .Build();

Примечание. Формат строки, используемый в UseUrls() метод это: http://{ip address}:{port number} ,
- Если вы используете * (звездочки) для IP-адреса, то есть все доступные IP-адреса на хосте.
- Номер порта не является обязательным. Если вы оставите это поле пустым, по умолчанию будет использоваться порт 80.

Существует множество дополнительных деталей о UseUrls() метод в официальных документах Microsoft здесь.

Однако SSL не будет работать с UseUrls() метод --- так, это означает, что если вы попытаетесь добавить URL, начинающийся с https:// программа скинет исключение

System.InvalidOperationException:
    HTTPS endpoints can only be configured using KestrelServerOptions.Listen().

Конечная точка конфигурации. Использование HTTPS и привязка SSL-сертификата

ВАЖНАЯ ЗАМЕТКА:
Хостинг через общедоступную конечную точку через Kestrel (даже с SSL) не рекомендуется, и вы должны использовать технологии, такие как обратные прокси (такие как Nginx или IIS), вместо этого выставляя Kestrel на волю.
--- Вы можете прочитать об этом в официальных документах Microsoft здесь.

Конечные точки HTTPS могут быть настроены только с использованием KestrelServerOptions,

Вот пример использования TCP-сокетов с использованием Listen метод:

WebHost.CreateDefaultBuilder(args)
    .UseKestrel(options =>
    {
        options.Listen(IPAddress.Loopback, 5000);  // http:localhost:5000
        options.Listen(IPAddress.Any, 80);         // http:*:80
        options.Listen(IPAddress.Loopback, 443, listenOptions =>
        {
            listenOptions.UseHttps("certificate.pfx", "password");
        });
    })
    .UseStartup<Startup>()
    .Build();

Примечание: если вы используете оба Listen метод и UseUrls, Listen конечные точки перекрывают UseUrls конечные точки.

Вы можете найти более подробную информацию о настройке конечных точек здесь на официальных документах Microsoft.

Если вы используете IIS, привязки URL для IIS переопределяют любые привязки, которые вы установили, вызвав Listen или же UseUrls, Для получения дополнительной информации см. Введение в основной модуль ASP.NET.

Вам не нужно реализовывать https с помощью kestrel. Если вы используете приложение, которое требует https, оно, скорее всего, будет обращено в Интернет. Это означает, что вам нужно запустить kestrel за nginx или Apache, и один из них обработает запрос https для вас.

Другие вопросы по тегам