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

我在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和应用程序网关并不完全免费).

最佳答案 因此,刚刚开始使用新的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以使用通配符

点赞