使用 AWS Certificate Manager (ACM) 和在 ELB 后面运行的 EC2 服务器通过 HTTPS 处理会话需要 LEMP 堆栈进行哪些更改?

Posted

技术标签:

【中文标题】使用 AWS Certificate Manager (ACM) 和在 ELB 后面运行的 EC2 服务器通过 HTTPS 处理会话需要 LEMP 堆栈进行哪些更改?【英文标题】:What changes require in LEMP stack for session handling over HTTPS with AWS Certificate Manager (ACM) and EC2 server running behind ELB? 【发布时间】:2018-04-07 17:59:18 【问题描述】:

我知道我可以使用 AWS Certificate Manager(ACM) 来获取通配符 SSL,即 *.example.com。

在 ACM 中创建的 SSL 证书可以在运行在 AWS ELB 后面的 EC2 上使用。

当 AWS ELB 从端口 443 向端口 80 上的 EC2 发出请求,浏览器中的 URL 仍在 HTTPS 上,内部 php 在 HTTP 上运行(不在 nginx 配置中侦听到 443)时,会出现问题,因此会话无效,并且应用程序注销流程发生并且会话无效。

我不知道如何解决这个问题,或者如何在没有 SSL 的情况下在 nginx 中配置端口 443?

PS

由于亚马逊不提供从 ACM 下载 SSL 私钥和公钥以通过端口 443 在 EC2 nginx 配置上设置 SSL 的选项。

【问题讨论】:

我怀疑这是 SSL 证书本身的问题。您在负载均衡器后面有多少台 EC2 服务器?您是否在负载均衡器上启用了粘性会话? 【参考方案1】:

当您将 SSL 添加到负载均衡器而不是您的实例时,您不必处理配置密钥或侦听新端口的问题。就 Web 服务器而言,您仍然在 HTTP 下运行,这有它自己的问题。

幸运的是,AWS 领先一步,have a header 我们可以用于此目的,如下例所示:

server 
  listen 80;
  server_name yoursitename;
  root /path/to/web/dir;

  index index.php;

  proxy_set_header X-Forwarded-Proto $scheme;
  if ( $http_x_forwarded_proto != 'https' ) 
    return 301 https://$host$request_uri;
  

  location ~ \.php$ 
      # PHP conf
  

您可能还需要编辑应用程序中的设置,告诉它您正在使用 HTTPS。这可能在配置文件或数据库中的设置中。

您现在很可能会收到一些不安全的内容警告。您不能通过 HTTPS 加载不安全的内容,因此请确保您没有通过 HTTP 加载任何图像或脚本。如果您想了解更多信息,Google Developers 对此so give it a read 有一个很好的指南。

【讨论】:

以上是关于使用 AWS Certificate Manager (ACM) 和在 ELB 后面运行的 EC2 服务器通过 HTTPS 处理会话需要 LEMP 堆栈进行哪些更改?的主要内容,如果未能解决你的问题,请参考以下文章

当我使用 python boto 连接到 aws ec2 时,它显示 SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify fai

AWS Certificate Manager - SSL 说正在使用,但 HTTPS 不起作用

将 AWS Certificate Manager(ACM 证书)与 Elastic Beanstalk 一起使用

AWS Certificate Manager 和 Elastic Beanstalk:创建没有域名的 SSL

AWS Certificate Manager 中处于待处理状态的证书

AWS Certificate Manager,无法获取子域的 https