如何为我的 Elastic Beanstalk 环境配置 HTTPS?

上次更新时间:2020 年 8 月 20 日

我想为 AWS Elastic Beanstalk 环境配置 HTTPS,以便加密从负载均衡器到 Amazon Elastic Compute Cloud (Amazon EC2) 实例的数据。

简短描述

如果您为 Elastic Beanstalk 环境购买并配置了自定义域名,则可以使用 HTTPS 允许用户安全连接到您的网站。如果您没有域名,仍可以将 HTTPS 与自签名证书一起使用以进行开发和测试。

推荐使用 AWS Certificate Manager (ACM) 工具以编程方式预置、管理和部署服务器证书。您还可以使用 AWS 命令行界面 (AWS CLI)。如果 ACM 在您所在的 AWS 区域不可用,您可以使用 AWS CLI 将第三方或自签名证书和私钥上传到 AWS Identity and Access Management (IAM)。

解决方法

准备您的 Elastic Beanstalk 环境

1.    要将流量路由到您的 Elastic Beanstalk 环境,可使用 Amazon Route 53 注册新域名,或向其他域名提供商注册。

2.    如果您的环境的 URL 包含 AWS 区域,请创建别名;如果您的环境的 URL 不包含 AWS 区域,请创建 CNAME 记录。

重要提示:您可以将 CNAME 记录用于在 2016 年之前创建的环境。您不能将 CNAME 记录与顶级域名(也称为 root 域名或裸域名)一起使用。有关更多信息,请参阅在别名和非别名记录之间做出选择

3.    在 ACM 中创建证书,或将第三方或自签名证书和私钥上传到 IAM

在负载均衡器上终止 HTTPS

1.    打开 Elastic Beanstalk 控制台,然后选择您的环境。

2.    在导航窗格中,选择配置

3.    在负载均衡器类别中,选择修改

4.    要为端口 443 添加侦听器,请根据您的 Elastic Beanstalk 环境中的负载均衡器类型选择以下某组步骤。

要为 Classic Load Balancer 添加侦听器,请执行以下步骤:

1.    选择添加侦听器

2.    对于端口,请输入传入流量端口(通常为 443)。

3.    对于协议,请选择 HTTPS

4.    对于实例端口,请输入 80

5.    对于实例协议,请选择 HTTP

6.    对于 SSL 证书,请选择您的证书,然后从下拉菜单中选择要使用的 SSL 策略

7.    选择添加,然后选择应用

要为 Application Load Balancer 添加侦听器,请执行以下步骤:

1.    选择添加侦听器

2.    对于端口,请输入传入流量端口(通常为 443)。

3.    对于协议,请选择 HTTPS

4.    对于 SSL 证书,请选择您的证书,然后从下拉菜单中选择要使用的 SSL 策略

5.    选择添加,然后选择应用

要为网络负载均衡器添加侦听器,请执行以下步骤:

1.    选择添加侦听器

2.    对于端口,请输入传入流量端口(通常为 443)。

3.    选择添加,然后选择应用

在负载均衡环境中终止实例上的 HTTP(端到端 HTTPS)

要将实例配置为终止 HTTPS 连接,您必须使用配置文件修改实例上运行的软件,并修改安全组以允许安全连接。

重要提示:如果您使用的是单实例环境,请跳过以下步骤,并完成在单实例环境中终止实例上的 HTTP(端到端 HTTPS)部分中的步骤。

1.    根据 Elastic Beanstalk 环境中的负载平衡器类型,使用以下某种配置文件将安全的侦听器添加到负载均衡器。

对于 Classic Load Balancer,请使用 .ebextensions/https-reencrypt-clb.config 文件:

option_settings:
  aws:elb:listener:443:
    InstancePort: 443
    InstanceProtocol: HTTPS
  aws:elasticbeanstalk:application:
    Application Healthcheck URL: HTTPS:443/

对于 Application Load Balancer,请使用 .ebextensions/https-reencrypt-alb.config 文件:

option_settings:
  aws:elbv2:listener:443:
    DefaultProcess: https
    ListenerEnabled: 'true'
    Protocol: HTTPS
  aws:elasticbeanstalk:environment:process:https:
    Port: '443'
    Protocol: HTTPS

对于网络负载均衡器,请使用 .ebextensions/https-reencrypt-nlb.config 文件:

option_settings:
  aws:elbv2:listener:443:
    DefaultProcess: https
    ListenerEnabled: 'true'
  aws:elasticbeanstalk:environment:process:https:
    Port: '443'

2.    更新负载均衡器以在端口 443 上接收流量。

您可以创建一个新的安全组,然后让 Elastic Beanstalk 使用该安全组在端口 443 上接收流量。例如,以下 .ebextensions/https-lbsecuritygroup.config 文件会创建一个安全组并将该安全组附加到负载均衡器。

option_settings:
  # Use the custom security group for the load balancer
  aws:elb:loadbalancer:
    SecurityGroups: '`{ "Ref" : "loadbalancersg" }`'
    ManagedSecurityGroup: '`{ "Ref" : "loadbalancersg" }`'
Resources:
  loadbalancersg:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: load balancer security group
      VpcId: vpc-#######
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
      SecurityGroupEgress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0

在前面的配置文件中,将 VpcId 替换为您的环境的相应值。

注意:上述示例包括通过端口 80 的入口和出口,以允许 HTTP 连接。要仅允许安全连接,请在 SecurityGroupIngress 部分中删除端口 80 的配置。

3.    添加允许在负载均衡器的安全组和实例的安全组之间通过端口 443 进行通信的入口和出口规则。

例如,您可以使用以下 .ebextensions/https-backendsecurity.config 文件:

Resources:
  # Add 443-inbound to instance security group (AWSEBSecurityGroup)
  httpsFromLoadBalancerSG: 
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]}
      IpProtocol: tcp
      ToPort: 443
      FromPort: 443
      SourceSecurityGroupId: {"Fn::GetAtt" : ["loadbalancersg", "GroupId"]}
  # Add 443-outbound to load balancer security group (loadbalancersg)
  httpsToBackendInstances: 
    Type: AWS::EC2::SecurityGroupEgress
    Properties:
      GroupId: {"Fn::GetAtt" : ["loadbalancersg", "GroupId"]}
      IpProtocol: tcp
      ToPort: 443
      FromPort: 443
      DestinationSecurityGroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]}

现在,负载均衡器使用 HTTPS 安全连接到后端实例。负载均衡器接受来自实例的任何证书,无论该证书是自签名的还是由受信任的证书颁发机构颁发的。

注意:您可以将策略添加到负载均衡器,以使其仅信任特定证书。例如,以下 .ebextensions/https-backendauth.config 文件会创建两项策略。一项策略指定公用证书,另一项策略则告知负载均衡器仅信任该证书以连接到实例端口 443。

option_settings:
  # Backend Encryption Policy
  aws:elb:policies:backendencryption:
    PublicKeyPolicyNames: backendkey
    InstancePorts:  443
  # Public Key Policy
  aws:elb:policies:backendkey:
    PublicKey: |
      -----BEGIN CERTIFICATE-----
      ################################################################
      ################################################################
      ################################################################
      ################################################################
      ################################################
      -----END CERTIFICATE-----

4.    配置在实例上运行的代理服务器以终止 HTTPS。

注意:配置因您的解决方案堆栈而异。 任何解决方案堆栈的 .ebextensions 都会对 .ebextensions 中的私有密钥和服务器证书的值进行硬编码。要进一步保护这些文件的安全,您可以在 Amazon Simple Storage Service (Amazon S3) 中上传内容,然后使用 S3Auth 将其拉取到 Amazon EC2 中

5.    要将配置文件部署到您的环境,请将配置文件添加到应用程序包 root 目录下名为 .ebextensions 的目录中。然后,部署包含这些配置文件的源代码。

在单实例环境中终止实例上的 HTTP(端到端 HTTPS)

1.    允许将端口 443 上的流量传入到 Elastic Beanstalk 应用程序在其上运行的 EC2 实例。

以下示例使用 .ebextensions 允许端口 443 上的传入流量:

Resources:
  sslSecurityGroupIngress: 
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]}
      IpProtocol: tcp
      ToPort: 443
      FromPort: 443
      CidrIp: 0.0.0.0/0

2.    配置在实例上运行的代理服务器以终止 HTTPS。

注意:配置因您的解决方案堆栈而异。任何解决方案堆栈的 .ebextensions 都会对 .ebextensions 中的私有密钥和服务器证书的值进行硬编码。要进一步保护这些文件的安全,您可以在 S3 中上传内容,然后使用 S3Auth 将其拉取到 Amazon EC2 中

3.    要将配置文件部署到您的环境,请将配置文件添加到应用程序包 root 目录下名为 .ebextensions 的目录中。然后,部署包含这些配置文件的源代码。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?