带有负载均衡器的 AWS Elastic Beanstalk Linux 托管实例上的 ASP.NET Core 3.1 - HTTPS
Posted
技术标签:
【中文标题】带有负载均衡器的 AWS Elastic Beanstalk Linux 托管实例上的 ASP.NET Core 3.1 - HTTPS【英文标题】:ASP.NET Core 3.1 on AWS Elastic Beanstalk Linux managed instances with load balancer - HTTPS 【发布时间】:2021-05-31 07:59:43 【问题描述】:我已经设置了一个 AWS Elastic Beanstalk 环境。
到目前为止,一切都很好,SSL 在负载均衡器上工作,并将请求转发到后台 Linux 实例上的内部端口 80。
但是,当尝试使用开箱即用的“使用 Google 登录”/“使用 Office 365 登录”时,我现在收到 URL 引用错误,因为实例正在传递 http://www.domainname.com
,因为它本身没有运行 SSL。
我已按照此处的指南进行操作:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/https-singleinstance-dotnet-linux.html
我有 SSL 证书和密钥,并设置了 conf 文件,但是实例似乎仍然不接受 SSL 连接。
我要么需要重写 _signInManager.ConfigureExternalAuthenticationProperties
方法以始终使用 HTTPS,要么让实例运行 HTTPS。
我尝试了不同的代理端口,80、5000 和 5001,但我认为 Kestrel 不需要证书,因为这是 nginx 正在做的,并且在内部将流量代理到 HTTP kestrel 服务器?
我在 AWS 网络中也有一个实例,我可以通过 RDP 访问并运行本地网络请求,即浏览到其中一个实例的 http://10.x.x.x,这可以工作,但同样不能通过 HTTPS。
【问题讨论】:
这应该不是问题,因为 SSL 在 LB 上终止,并且 Elastic Beanstalk 环境应该只使用 HTTP 获取请求。您是否检查了 Elastic Beanstalk 环境中的日志? 所以 OAuth 请求是http://
,因为应用程序是 http://
- 这在技术上没问题,我只需要在 https://
而不是内部方案中获取 OAuth 请求
不确定我是否理解这个问题,但如果您想强制执行 SSL/HTTPS,那么您可以添加从 http 到 https 的重定向。如果您使用 ALB:aws.amazon.com/premiumsupport/knowledge-center/…
好的,要将 ALB 转发到的实例端口是什么?由于 443 在实例级别不起作用,只有端口 80。所以端到端加密也不存在
不过,可能是这个——***.com/questions/61580965/…
【参考方案1】:
好的,这里有一些事情在起作用。
首先,在代理或负载均衡器后面运行 ASP.NET Core Web 应用程序,您需要添加适当的标头: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer?view=aspnetcore-5.0
services.Configure<ForwardedHeadersOptions>(options =>
options.ForwardedHeaders =
ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
);
并在ConfigureServices
中添加:
app.UseForwardedHeaders();
这允许应用程序使用代理地址。
在我的实例中,我也想要负载均衡器和实例之间的 TLS,这也是另一回事。
因此,.ebextensions
文件夹需要配置以按照此处的指南将证书添加到实例:
https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/https-singleinstance-dotnet-linux.html
您需要添加公钥和私钥。
额外的 Nginx 配置需要进入 .platform
文件夹,该文件夹不在文档中,但在此处:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/platforms-linux-extend.html
和这里:
Beanstalk deployment ignores my nginx configuration files in .ebextensions
如果不是,则需要应用 SSL 侦听器。
现在我从负载均衡器通过 TLS,更重要的是,OAuth 配置在应用程序知道它是 https://
并传递正确的引荐来源网址时工作。
此外,Kestrel 在默认端口 5000 上运行。您可以为 http(端口 80)和 https (443) 添加一个侦听器,以使两者都转到此端口。
【讨论】:
以上是关于带有负载均衡器的 AWS Elastic Beanstalk Linux 托管实例上的 ASP.NET Core 3.1 - HTTPS的主要内容,如果未能解决你的问题,请参考以下文章
如何在 AWS Elastic Beanstalk 应用程序负载均衡器上运行的 Spring webapp 上获取请求者 IP
AWS Elastic Beanstalk 上带有 Tomcat 7 的 Websocket
AWS Elastic Beanstalk 负载均衡器在哪里寻找认证?
是否可以将负载均衡器添加到没有负载均衡器的现有 AWS Elastic Beanstalk 应用程序?