如何使用 ASP.NET 5 Kestrel 在 Service Fabric 网关模式中处理 HTTPS 请求

How to handle HTTPS requests in Service Fabric gateway pattern using ASP.NET 5 Kestrel

我有一个带有无状态服务的 Service Fabric,遵循网关模式侦听 HTTP 请求,然后将它们转发到集群中的业务逻辑。效果很好。现在我正在尝试添加 HTTPS 支持。网关项目使用 ASP.NET Core 1.0(在 NET461 上),我使用的是 Service Fabric SDK 5.1.150,Visual Studio 2015 Update 3。如果我手动启动网关项目(设置为启动项目)然后我可以访问 HTTPS 端点,但是当我通过集群 运行 它时,端口是打开的,但它立即关闭,我在 Chrome 中得到 "localhost unexpectedly closed the connection."。这是我的启动代码:

                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 端口。任何 suggestions/samples?

我假设您引用了安装到本地证书存储中的证书(例如 LOCAL_MACHINE)。如果是这种情况,请确保您为私钥配置了正确的权限。

长话短说,私钥上的默认 ACL 不允许 NETWORK SERVICE 帐户访问证书的密钥。当证书由 Azure 安装时,只有 SYSTEM 和管理员被授予对私钥的完全控制和读取权限。所有 Service Fabric 服务都在 NETWORK SERVICE 下 运行,因此无法访问私钥。

解决方法是添加NETWORK SERVICE并授予Read(是的,只是Read,没有完全控制)权限如下:

愉快的 Service Fabric 编程!

我可能是错的,但在撰写本文时(2016 年 7 月)我认为 Kestrel 没有 https。

我采用的方法是使用应用程序网关终止 http 和 https,然后转发到服务结构内的 HTTP 套接字。

我知道它没有明确回答您的问题,但我认为这是正确的解决方案。