Как обрабатывать HTTPS-запросы в шаблоне шлюза Service Fabric с помощью ASP.NET 5 Kestrel

У меня есть Service Fabric с сервисом без сохранения состояния, который следует шаблону шлюза, который прослушивает HTTP-запросы и затем перенаправляет их в бизнес-логику в кластере. Это прекрасно работает. Сейчас пытаюсь добавить поддержку HTTPS. В проекте шлюза используется ASP.NET Core 1.0 (на NET461), и я использую SDK 5.1.150 для Service Fabric, обновление 3 для Visual Studio 2015. Если я запускаю проект шлюза вручную (установлен как запускаемый проект), я могу нажать Конечная точка HTTPS, но когда я запускаю ее через кластер, порт открыт, но сразу закрывается, я получаю «localhost неожиданно закрыл соединение». в Chrome. Вот мой код запуска:

                builder
                 .UseKestrel(options => 
                 {
                     options.NoDelay = true;
                     options.ThreadCount = 1024;

                     if (sslCert != null)
                     {
                         options.UseHttps(sslCert);
                     }
                 })
                 .UseUrls("http://*:5402", "https://*:5403")
                 .UseContentRoot(System.IO.Directory.GetCurrentDirectory())
                 .UseStartup<Startup>()
                 .Build()
                 .Run();

Что может быть уникальным, так это то, что я пытаюсь использовать Kestrel, но я следовал образцу, использующему это (за исключением того, что образец не использовал HTTPS). Переменная sslCert установлена, опять же, если я запустил ее с этим проектом в качестве проекта запуска в VS, тогда я смогу обрабатывать запросы HTTPS.

Я настроил конечную точку в кластере, но, похоже, это не имеет значения, я все равно могу попасть в порт tcp, если я его оставлю. Любые предложения / образцы?


person Haukman    schedule 01.07.2016    source источник


Ответы (2)


Я предполагаю, что вы ссылались на сертификат, который был установлен в локальном хранилище сертификатов (например, LOCAL_MACHINE). В этом случае убедитесь, что вы настроили правильные разрешения для закрытого ключа.

Короче говоря, ACL по умолчанию для закрытого ключа не позволяет учетной записи NETWORK SERVICE получить доступ к ключу сертификата. Когда сертификат установлен в Azure, только SYSTEM и администраторы получают разрешения на полный доступ и чтение для закрытого ключа. Все службы Service Fabric работают под NETWORK SERVICE и поэтому не могут получить доступ к закрытому ключу.

Решение состоит в том, чтобы добавить СЕТЕВОЙ СЕРВИС и предоставить права чтения (да, только чтение, а не полный контроль) следующим образом:

введите здесь описание изображения

Удачного программирования в Service Fabric!

person user3946037    schedule 05.07.2016

Я мог ошибаться, но на момент написания (июль 2016 г.) я не думал, что Kestrel использует https.

Подход, который я выбрал, заключается в использовании шлюза приложений для завершения как http, так и https, а затем перенаправления на HTTP-сокет внутри служебной фабрики.

Я знаю, что это не дает прямого ответа на ваш вопрос, но я думаю, что это правильное решение.

person Nick Randell    schedule 07.07.2016
comment
В настоящее время Kestrel поддерживает HTTPS. http://dotnetoughtts.net/how-to-setup-https-on-kestrel/ И приведенный выше ответ работает для нас (с использованием Kestrel). - person Haukman; 08.07.2016