我在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以使用通配符
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。