我有一个具有无状态服务的Service Fabric,遵循网关模式侦听HTTP请求,然后将它们转发到集群中的业务逻辑。这很好用。现在我尝试添加HTTPS支持。网关项目正在使用ASP.NET Core 1.0(在NET461上)和我在Service Fabric SDK 5.1.150,Visual Studio 2015 Update 3.如果我手动启动网关项目(设置为启动项目),那么我可以点击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端口。有什么建议/样品吗?
答案 0 :(得分:1)
我假设您引用了安装在本地证书库中的证书(例如LOCAL_MACHINE)。如果是这种情况,请确保您已为私钥配置了正确的权限。
简而言之,私钥上的默认ACL不允许NETWORK SERVICE帐户访问证书密钥。当Azure安装证书时,只有SYSTEM和Administrators被授予对私钥的完全控制和读取权限。所有Service Fabric服务都在NETWORK SERVICE下运行,因此无法访问私钥。
解决方案是添加NETWORK SERVICE并授予Read(是,只读,没有完全控制)权限,如下所示:
Happy Service Fabric编程!
答案 1 :(得分:0)
我可能错了,但在撰写本文时(2016年7月),我并不认为Kestrel做了https。
我采用的方法是使用应用程序网关终止http和https,然后转发到服务结构内的HTTP套接字。
我知道它没有明确回答你的问题,但我认为这是正确的解决方案。