Asp.net core 如何在单个服务结构群集上承载具有唯一SSL证书的多个启用HTTPS的站点

Asp.net core 如何在单个服务结构群集上承载具有唯一SSL证书的多个启用HTTPS的站点,asp.net-core,azure-service-fabric,Asp.net Core,Azure Service Fabric,我有Azure上的服务结构群集。我想使用此群集托管多个基于ASP.NET核心的站点。所有站点都必须通过HTTPS(端口443)在互联网上访问。此外,每个站点在不同的域上运行,因此具有唯一的SSL证书。有些网站甚至有通配符证书 我了解到,使用WebListener是在ServiceFabric上托管基于ASP.NET核心的站点的推荐方法。据我所知,WebListener应该通过使用请求HTTP头来识别请求的站点,从而支持将多个站点绑定到同一端口。这很酷,但是我还没有找到关于如何将SSL证书绑定到站

我有Azure上的服务结构群集。我想使用此群集托管多个基于ASP.NET核心的站点。所有站点都必须通过HTTPS(端口443)在互联网上访问。此外,每个站点在不同的域上运行,因此具有唯一的SSL证书。有些网站甚至有通配符证书

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

如果在使用WebListener时无法将证书绑定到特定站点,我不知道有什么实际的方法可以实现这一点

是否有人知道如何以一种实用的方式来解决这个问题,即以最少的工作量和费用(性能或基础设施成本)将新站点添加到集群


我想一种方法是为每个站点使用唯一的端口,然后在Azure负载平衡器和/或应用程序网关上工作。这可能会使管理变得有点复杂,甚至成本高昂(公共IP和应用程序网关并非完全免费)。

因此,刚刚创建了一个新的ASP.Net Core网站,我可以看到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>

然后在ServiceFabric应用程序清单中,使用指纹添加证书(应该已经部署到VMS),以标识要使用的证书,如下所示

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

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

编辑: 修复了服务url中的输入错误(Approt位于错误位置),并用weblistener替换了默认的kestrel扩展

编辑2:
更新服务url以使用通配符,因为绑定如何与Web侦听器一起工作正如您所说的,一种方法是使用X个公共IP地址(我们使用3个域)。每个端口都被转发到一个内部端口(每个端口都不同),该端口上有一个网站列表(或者一个应用程序监听多个端口)。然后,您可以将SSL等分配给其中的每一个


PublicIP1:443->端口447->Webapp在端口447上侦听
PublicIP2:443->端口448->Webapp在端口448上侦听
PublicIP3:443->端口449->Webapp在端口449上侦听


总而言之,使用ServiceFabric作为网站的托管解决方案可能不是我愿意做的事情。如果我必须托管多个(阅读多个)网站,我会在Azure应用程序服务上这样做。如果我当时需要大规模地处理/持久化数据,我会考虑使用SF。但这并不意味着网站必须在SF上运行。

对不起,这不符合我的要求。我想有多个网站,每个绑定到不同的域,而不是在不同的路径。此外,每个站点都需要单独的SSL证书。另外,Kestrel不适用于面向互联网的网站,所以我不能使用它。此外,我认为这甚至不起作用,因为Kestrel不支持端口共享。你不应该将多个kestrel服务器绑定到一个端口。你的更新答案也不应该阻止它。请看,主要问题是同一端口上有多个SSL证书,我认为这与service fabric无关。我同意您的评论,最初的编辑纯粹是由于疏忽了复制和粘贴以及初始serviceUrl中的键入错误,并不是出于任何特定目的。由于WebListener如何处理其绑定,我现在也更新了在服务url中使用通配符。也就是说,正如您所提到的,这目前只适用于同一端口上具有相同证书的多个站点。我会继续调查,如果我找到一个干净的方法来解决这个问题,我会让你知道。如果不是的话,我会删除答案。我昨天试着实现了这一点,事实上,如果一个网站的数量不是很高,那么它是有效的,并且可能是可以管理的。但实际上,使用应用程序服务更容易,而且在这一点上可能更适合。不幸的是,如果我能够高效、轻松地将service fabric基础设施重新用于一般站点托管,那就太好了。另一种解决方法是在前面放置类似HAProxy的东西,以处理SSL终止和反向代理请求,并将其发送到SF中运行的正确Web应用程序。然后,您可能需要让WebApps在启动时向HAProxy注册,在关闭时取消注册。