我在 Elastic Beanstalk 上有一个正在运行的应用程序,并且希望仅通过 HTTPS 访问它。因为我希望应用程序能够自动扩展,所以我需要在负载均衡器级别而不是单个 EC2 实例级别配置 HTTPS。我正在关注本教程关于如何使用 Elastic Beanstalk 配置 HTTPS。但是,当我完成本教程时,我的域从未加载(在 http 或 https 上),并且我在浏览器中收到会话超时。
以下是我目前所掌握的信息:
- 在 Elastic Beanstalk 上运行的应用程序。具体内容:在预配置的 Glassfish Docker 容器上运行的 Java EE 应用程序。
- 来自 Route 53 的有效域,已设置为我的 Elastic Beanstalk 应用程序。
- 来自 GoDaddy 的签名证书,根据我提供的教程链接创建并上传到 IAM。
现在,我认为这是问题出现的地方。教程的第 4 步告诉我必须更新我的安全组(至于更新哪个,非常模糊)。因此,我像这样更新了负载均衡器安全组(删除 http 请求,仅支持 https):
然后,在 Elastic Beanstalk 环境配置设置中,我进行如下设置:
(如果我关闭侦听器端口,则域永远不会在 http 或 https 上加载)。使用这些设置,如果我转到我的域(例如:myapp.com),它将继续加载,直到浏览器显示超时异常。如果我指定协议(例如:https://myapp.com)它将继续加载,直到浏览器显示超时异常。如果我转到指定了 HTTPS 协议的特定链接(例如:https://myapp.com/login.xhtml) 然后它将加载(注意:在尝试应用 SSL 之前,应用程序运行良好;欢迎页面已通过服务器设置)。我做错了什么?
问题总结:如何配置我的 Elastic Beanstalk 应用程序以仅通过 HTTPS 工作?
期望结果:用户在其地址栏中键入应用程序域(例如:myapp.com),它会将他们带到使用 HTTPS 保护的应用程序(例如:https://myapp.com)。
答案1
您不能通过禁用 http 访问来执行此操作。
您可以在实例的 Web 服务器中执行此操作。如果传入请求没有X-Forwarded-Proto: https
ELB 在通过 https 传入请求时添加的标头,则您的 Web 服务器需要HTTP/1.1 301 Moved Permanently
向浏览器发送重定向,并Location: https://...
在响应中指定。
除非您的应用程序告诉它这样做,否则新访问者的浏览器无法自动知道它应该使用 https 重试。
还有其他更高级的方法可以实现这一点,但它们仍然不涉及 ELB(弹性负载均衡器)或 EB(弹性 beantalk)或安全组配置。