0

我有一个带有无状态服务的 Service Fabric,它遵循网关模式侦听 HTTP 请求,然后将它们转发到集群中的业务逻辑。这很好用。现在我正在尝试添加 HTTPS 支持。网关项目使用 ASP.NET Core 1.0(在 NET461 上),我使用的是 Service Fabric SDK 5.1.150、Visual Studio 2015 Update 3。如果我手动启动网关项目(设置为启动项目),那么我可以点击HTTPS 端点,但是当我通过集群运行它时,端口是打开的,但它会立即关闭,我得到“本地主机意外关闭了连接”。在铬。这是我的启动代码:

                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 端口。有什么建议/样品吗?

4

2 回答 2

1

I assume you referenced a cert that was installed into a local cert store (e.g. LOCAL_MACHINE). If that's the case, make sure you have configured the correct permissions for the private key.

To cut a long story short, the default ACL on the private key does not allow NETWORK SERVICE account to access the cert’s key. When the cert is installed by Azure, only SYSTEM and Administrators are granted Full Control and Read permissions on the private key. All Service Fabric services are running under NETWORK SERVICE and therefore could not access the private key.

The solution is to add NETWORK SERVICE and grant Read (yes, just Read, and no full control) permissions as follows:

enter image description here

Happy Service Fabric programming!

于 2016-07-05T21:04:48.007 回答
0

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

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

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

于 2016-07-07T13:38:23.730 回答