如何在单个Service Fabric群集上托管具有唯一SSL证书的多个启用HTTPS的站点

时间:2016-10-05 09:29:40

标签: asp.net-core azure-service-fabric

我在Azure上有Service Fabric群集。我想使用此群集来托管多个基于ASP.NET Core的站点。所有站点都必须通过HTTPS(在端口443上)在Internet上访问。每个站点也在不同的域上运行,因此具有唯一的SSL证书。有些网站甚至拥有外卡证书。

我了解到使用WebListener是在Service Fabric上托管基于ASP.NET Core的站点的推荐方法。据我所知,WebListener应该支持通过使用请求HTTP标头来识别所请求的站点,将多个站点绑定到同一个端口。这很酷,但我没有找到有关如何将SSL证书绑定到站点(主机名)的信息。它甚至可能吗?

如果在使用WebListener时无法将证书绑定到特定站点,我不知道实现此目的的任何实际方法。

是否有人知道如何以最少的工作和费用(性能或基础架构成本)以新的网站添加新网站的方式解决此问题?

我想一种方法是为每个站点使用唯一端口,然后在Azure Load Balancer和/或Application Gateway上进行工作。这可能会使管理变得有点复杂,甚至成本也很高(公共IP和应用程序网关并不完全免费)。

2 个答案:

答案 0 :(得分:1)

因此,刚刚开始使用新的ASP.Net Core WebSite,我可以看到program.cs文件包含.Net Core的特定ICommunicationListner实现。我将修改该侦听器上的以下方法,以允许您指定应用程序根目录,类似于默认的Owin通信侦听器对WebAPI所执行的操作。这将允许您将多个站点绑定到单个端口。


Task ICommunicationListener.OpenAsync(CancellationToken cancellationToken)
            {
                var endpoint = FabricRuntime.GetActivationContext().GetEndpoint(_endpointName);

                string serverUrl = $"{endpoint.Protocol}://{FabricRuntime.GetNodeContext().IPAddressOrFQDN}:{endpoint.Port}";

                _webHost = new WebHostBuilder().UseWebListener()
                                               .UseContentRoot(Directory.GetCurrentDirectory())
                                               .UseStartup()
                                               .UseUrls(serverUrl)
                                               .Build();

                _webHost.Start();

                return Task.FromResult(serverUrl);
            }

此更改可能如下所示:

string serverUrl = $"{endpoint.Protocol}://+{endpoint.Port}/{this.appRoot}";

然后在服务清单文件中调整端点配置以在https和443上运行

 <Endpoints>
      <Endpoint Protocol="https" Name="ServiceEndpoint" Type="Input" Port="443" />
</Endpoints>

然后在Service Fabric应用程序清单中添加证书(应该已经部署到VMS),使用指纹识别要使用的证书,如此。

        

然后仍在应用程序清单中添加策略以将该证书绑定到服务的端点

<ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="Web1Pkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides />
    <Policies>
      <EndpointBindingPolicy EndpointRef="ServiceEndpoint" CertificateRef="Cert1" />
    </Policies>
  </ServiceManifestImport>

编辑: 修复了服务URL中的拼写错误(approot位于错误的位置)并用weblistener替换了默认的kestrel扩展名。

编辑2: 由于绑定如何与Web Listener一起使用,更新了服务URL以使用通配符

答案 1 :(得分:0)

正如您已经说过的,一种方法(我们使用3个域),就是拥有X个公共IP地址。其中每个都转发到一个内部端口(每个端口不同),该端口在该端口上有一个网站列表(或一个应用程序在多个端口上监听)。然后你可以为每个人分配SSL等。

PublicIP1:443 -> Port 447 -> Webapp listening on port 447 PublicIP2:443 -> Port 448 -> Webapp listening on port 448 PublicIP3:443 -> Port 449 -> Webapp listening on port 449

总而言之,使用ServiceFabric作为网站的托管解决方案可能不是我会做的事情。如果我必须托管多个(读取很多)网站,我会在Azure App Service上执行此操作。如果我需要按比例处理/持久化数据,我会考虑使用SF。但这并不意味着网站必须在SF上运行。