带有负载均衡器的 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 应用程序?

如何在 AWS 中为 Elastic Beanstalk 设置应用程序负载均衡器

AWS Elastic Beanstalk 应用程序初始访问不安全,但后续重定向是