跳至内容

如何为我的 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。

解决方法

准备您的 Elastic Beanstalk 环境

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

如果环境的 URL 包含区域,请创建一个别名。如果环境的 URL 不包含区域,请创建 CNAME 记录。

**重要事项:**对于 2016 年之前创建的环境,您可以使用 CNAME 记录。您无法对 Zone Apex(机构根网域)域(也称为根域或裸域)使用 CNAME 记录。有关详细信息,请参阅别名和 CNAME 记录的比较

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

为负载均衡器添加侦听器

完成以下步骤:

  1. 打开 Elastic Beanstalk 控制台
  2. 选择您的环境。
  3. 在导航窗格中,选择 Configuration(配置)。
  4. Load balancer(负载均衡器)类别中,选择 Modify(修改)。
  5. 要为端口 443 添加侦听器,请针对 Elastic Beanstalk 环境中的负载均衡器完成相关步骤。
    **注意:**最佳做法是使用应用程序负载均衡器网络负载均衡器

对于应用程序负载均衡器

完成以下步骤:

  1. 选择 Add Listener(添加侦听器)。
  2. 对于 Port(端口),输入传入流量端口。例如 443。
  3. 对于 Protocol(协议),选择 HTTPS
  4. 对于 SSL certificate(SSL 证书),选择您的证书,然后从下拉列表中选择 SSL policy(SSL 策略)。
  5. 选择 Add(添加),然后选择 Apply(应用)。

对于网络负载均衡器

完成以下步骤:

  1. 选择 Add Listener(添加侦听器)。
  2. 对于 Port(端口),输入传入流量端口。例如 443。
  3. 选择 Add(添加),然后选择 Apply(应用)。

对于经典负载均衡器

完成以下步骤:

  1. 选择 Add Listener(添加侦听器)。
  2. 对于 Port(端口),输入传入流量端口。例如 443。
  3. 对于 Protocol(协议),选择 HTTPS
  4. 对于 Instance Port(实例端口),输入 80
  5. 对于 Instance Protocol(实例协议),选择 HTTP
  6. 对于 SSL certificate(SSL 证书),选择您的证书,然后从下拉列表中选择 SSL policy(SSL 策略)。
  7. 选择 Add(添加),然后选择 Apply(应用)。

配置实例以停止 HTTPS 连接

要配置您的实例以停止 HTTPS 连接,请使用 .ebextensions 配置文件修改实例上运行的软件。有关详细信息,请参阅终止在 Linux 上运行 .NET Core 的 Amazon EC2 实例上的 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:
        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"]}
    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"]}
  4. 将以下代码片段添加到您的配置文件中,然后将其保存到 .ebextensions 目录中:

    files:
      /etc/pki/tls/certs/server.crt:
        content: |
          -----BEGIN CERTIFICATE-----
          certificate file contents
          -----END CERTIFICATE-----
    
      /etc/pki/tls/certs/server.key:
        content: |      
          -----BEGIN RSA PRIVATE KEY-----
          private key contents
          -----END RSA PRIVATE KEY-----

    **注意:**请将 certificate file contents 替换为您的证书文件内容,将 private key contents 替换为您的私钥内容。

    HTTPS 终止配置因解决方案堆栈而异。对于任何解决方案堆栈,.ebextensions 均会将私钥和服务器证书的值硬编码在 .ebextensions 中。为了进一步保护这些文件,请将文件内容上传到 Amazon Simple Storage Service (Amazon S3),然后使用 S3Auth 将其拉取到 Amazon EC2

  5. 使用文件密钥在实例 /etc/pki/tls/certs/server.crt 上创建以下文件。

  6. 使用以下证书文件在实例上创建证书文件:

         -----BEGIN CERTIFICATE-----
      certificate file contents
      -----END CERTIFICATE-----
      -----BEGIN CERTIFICATE-----
      first intermediate certificate
      -----END CERTIFICATE-----
      -----BEGIN CERTIFICATE-----
      second intermediate certificate
      -----END CERTIFICATE-----

    **注意:**请将 certificate file contents 替换为您的证书内容。如果您有中间证书,请将其包含在 server.crt 中,置于站点证书之后。

  7. 使用 /etc/pki/tls/certs/server.key 在实例上创建私钥文件。
    **注意:**请将 private key contents 替换为用于创建证书请求或自签名证书的私钥的内容。

  8. 配置在实例上运行的代理服务器以终止 HTTPS。所有平台均以统一方式启动代理服务器配置。

  9. 将配置文件添加到应用程序包根目录下名为 .ebextensions 的目录中,以将配置文件部署到您的环境。

  10. 部署包含配置文件的源代码。

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

使用 .ebextensions 文件,以允许端口 443 上的传入流量流向运行 Elastic Beanstalk 应用程序的实例。

示例:

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

然后,配置在实例上运行的代理服务器以终止 HTTPS。

注意:HTTPS 终止配置因解决方案堆栈而异。对于任何解决方案堆栈,.ebextensions 均会将私钥和服务器证书的值硬编码在 .ebextensions 中。为了进一步保护这些文件,请将文件内容上传到 Amazon Simple Storage Service (Amazon S3),然后使用 S3Auth 将其拉取到 Amazon EC2

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

AWS 官方已更新 8 个月前