Как использовать 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?


person Svek    schedule 07.10.2017    source источник
comment
См. Этот пост blogs.msdn.microsoft.com/webdev/2017/11/29/ и полный исходный код github.com/aspnet/samples/tree/master/samples/aspnetcore/   -  person natenho    schedule 16.12.2017


Ответы (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-сертификата

Конечные точки 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 Core.

person Svek    schedule 07.10.2017
comment
Вы можете предоставить информацию о том, как сгенерировать certificate.pfx, например, используйте andrewlock.net/ в качестве отправной точки? - person Andrei Rînea; 15.11.2017
comment
@ AndreiRînea - Это действительно широкий вопрос. Вы можете получить сертификат SSL, купив его, или можете подписать его самостоятельно. Этот процесс также зависит от вашей операционной системы и т. Д. Если вы используете Windows, возможно, взгляните на certreq.exe или вы также можете использовать IIS. - person Svek; 15.11.2017
comment
Kestrel для ASP.NET Core 2 достаточно безопасен для общедоступной конечной точки. Пустельги для ASP.NET Core 1 не было. - person robrich; 23.11.2017
comment
@robrich Есть ссылки на это заявление? - person Anttu; 27.11.2017
comment
@Anttu: перейдите на docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/ и переключаться между вкладками 2.0 и 1.1. - person robrich; 14.12.2017
comment
Вы используете файл pfx, но как загрузить из хранилища сертификатов? Я пробовал с listenOptions.UseHttps(httpsOptions=>{ var localhostCert = CertificateLoader.LoadFromStoreCert("Test certificate", "My", StoreLocation.CurrentUser, allowInvalid:true);.... Я создал сертификат с помощью PowerShell, но NET Core не может его найти - person Junior Mayhé; 17.06.2018
comment
Вам может потребоваться использовать порт с большим номером (например, 44300), если вы не работаете с правами администратора. Если вы хотите получить доступ к сайту https с другого устройства, вы должны использовать IPAddress.Any, что позволяет прослушивать "извне". - person Simon_Weaver; 30.12.2018
comment
Я хочу, чтобы мой код не зависел от того, использует ли он IIS или Kestrel. У меня это работает, так что с IIS он может найти сертификат, связанный с портом 443, с помощью команды netsh http. Как мне это сделать для пустельги? - person Quarkly; 04.04.2019
comment
@Svek полностью сработал! Но помните, что вы должны использовать пустельгу, чтобы функционировать; Использование nginx означает совершенно другой способ настройки. - person zion; 22.10.2019
comment
Очень полезно, за исключением того, что мне пришлось явно удалить UseUrls. Только после удаления конечные точки, настроенные через Listen, работали успешно. - person Pieter Meiresone; 29.03.2020
comment
@Svek Если мы хотим использовать два сертификата, как показано ниже, это сработает. .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); listenOptions.UseHttps (certificate1.pfx, password1);});}) Пожалуйста, предложите мне. - person Mohan Gopi; 09.10.2020
comment
как использовать разные пути сертификата pfx для dev и prod env? приведенный выше код кажется жестко запрограммированным. - person Lei Yang; 14.01.2021
comment
@LeiYang, вы, вероятно, захотите получить это от своего IHostingEnvironment, а затем выполнить if - person Svek; 14.01.2021
comment
но в опубликованном вами разделе кода нет IHostingEnvironment ссылки, поэтому я задаю этот вопрос. - person Lei Yang; 14.01.2021

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

person Michael    schedule 07.10.2017
comment
Это не правда. Во многих случаях зашифрованная связь для Kestrel используется внутри компании и / или не размещается на общедоступной конечной точке. - person Svek; 07.10.2017
comment
Да, внутри все в порядке. Но OP говорит о https. Итак, я предположил, что он будет обращен наружу. Кроме того, то, что кто-то использует пустельгу в общедоступной конечной точке, не означает, что это хорошо. По моему опыту, я никогда бы не стал достаточно доверять пустельге, чтобы столкнуться с этим перед публикой. Особенно, когда Microsoft сама этого не рекомендует. - person Michael; 07.10.2017
comment
Проголосовали против. Множество причин, по которым нужен https с пустельгой отдельно. По словам Дэмиана Эдвардса, Kestrel теперь является поддерживаемым, но не сертифицированным пограничным сервером. - person Rich S; 03.12.2017
comment
@RichS Я вижу много контента от Дэмиана Эдвардса, где он рекомендует всегда запускать Kestrel за другим полнофункциональным веб-сервером. Я не могу найти случая, когда он рекомендовал бы его в качестве пограничного сервера без этого. Не могли бы вы поделиться ссылкой? - person Charlie Flowers; 10.04.2018
comment
@Michael Вопрос был в том, как мне настроить Kestrel для использования SSL в ASP.NET Core 2.x? Ответ, почему вы не используете обратный прокси, не отвечает на вопрос. - person Rich S; 15.04.2018
comment
@CharlieFlowers Вы можете использовать Kestrel без пограничного сервера с SSL во внутренней сети: docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/ - person Rich S; 15.04.2018
comment
Я думаю, что предложение @Michael все еще актуально, но, возможно, это не прямой ответ на OP, поэтому для этикета StackOverflow это могло бы выглядеть лучше как комментарий к первоначальному вопросу. - person superjos; 17.04.2018
comment
Мы используем Kestrel внутри компании, но наши сетевые администраторы требуют, чтобы все серверы использовали SSL. - person Michael Earls; 07.08.2018