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

3 分钟阅读
0

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

简述

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

对于单实例环境,您必须在本地创建私钥和证书。然后,将证书上传到 AWS Identity and Access Management(IAM)。

最佳做法是使用 AWS Certificate Manager(ACM)以编程方式预置、管理和部署服务器证书。您还可以使用 AWS 命令行界面(AWS CLI)将第三方或自签名证书和私钥上传到 IAM。如果 ACM 在您的 AWS 区域不可用,请使用 AWS CLI。

**注意:**如果您在运行 AWS 命令行界面(AWS CLI)命令时收到错误,请参阅排查 AWS CLI 错误。此外,确保您使用的是最新版本的 AWS CLI

解决方案

准备您的 Elastic Beanstalk 环境

  1. 要将流量路由到您的 Elastic Beanstalk 环境,请使用 Amazon Route 53 注册新域或其他域提供商。
  2. 如果环境的 URL 包含区域,请创建一个别名。如果环境的 URL 不包含区域,请创建 CNAME 记录。
    **重要事项:**您可以将 CNAME 记录用于 2016 年之前创建的环境。您不能将 CNAME 记录与 Zone Apex [机构根网域(也称为根域或裸域)]一起使用。有关详细信息,请参阅Choosing between alias and non-alias records
  3. 在 ACM 中创建证书,或将第三方或自签名证书和私钥上传到 IAM

为负载均衡器添加侦听器

  1. 打开 Elastic Beanstalk 控制台,然后选择您的环境。
  2. 在导航窗格中,选择配置
  3. 负载均衡器类别中,选择修改
  4. 要为端口 443 添加侦听器,请为 Elastic Beanstalk 环境中的负载均衡器完成相关步骤。

经典负载均衡器

完成下面的步骤:

  1. 选择添加侦听器
  2. 对于端口,输入传入流量端口,通常为 443。
  3. 对于协议,选择 HTTPS
  4. 对于实例端口,输入 80
  5. 对于实例协议,选择 HTTP
  6. 对于 SSL 证书,选择您的证书,然后从下拉列表中选择 SSL 策略
  7. 选择添加,然后选择应用

应用程序负载均衡器

完成下面的步骤:

  1. 选择添加侦听器
  2. 对于端口,输入传入流量端口,通常为 443。
  3. 对于协议,选择 HTTPS
  4. 对于 SSL 证书,选择您的证书,然后从下拉列表中选择 SSL 策略
  5. 选择添加,然后选择应用

网络负载均衡器

完成下面的步骤:

  1. 选择添加侦听器
  2. 对于端口,输入传入流量端口,通常为 443。
  3. 选择添加,然后选择应用

配置实例以终止 HTTPS 连接

要将实例配置为终止 HTTPS 连接,请使用配置文件修改实例上运行的软件。此外,使用配置文件修改安全组,以便它们允许安全连接。

**重要信息:如果使用的是单实例环境,请跳过下面的步骤。完成在单实例环境中终止实例上的 HTTPS(端到端 HTTPS)**部分中的步骤。

  1. 向负载均衡器添加安全侦听器。根据 Elastic Beanstalk 环境中的负载均衡器类型,使用以下其中一个配置文件。

    对于经典负载均衡器,请使用 .ebextensions/https-reencrypt-clb.config 文件:

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

    对于应用程序负载均衡器,请使用 .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:
    
  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 的入站和出站,以允许 HTTPS 连接。要仅允许安全连接,请在 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. 要将配置文件部署到您的环境,请将配置文件添加到应用程序包根目录下名为 .ebextensions 的目录中。然后,部署包括配置文件的源代码。

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

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

    以下示例使用 .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 中私钥和服务器证书的值。为了进一步保护这些文件,您可以将内容上传到 Amazon S3,然后使用 S3Auth 将其拉取到 Amazon EC2

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

AWS 官方
AWS 官方已更新 6 个月前