跳至內容

如何為我的 Elastic Beanstalk 環境設定 HTTPS?

4 分的閱讀內容
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 Command Line Interface (AWS CLI) 將第三方或自我簽署憑證和私有金鑰上傳至 IAM。如果您的 AWS 區域無法使用 ACM,請使用 AWS CLI。

解決方法

準備您的 Elastic Beanstalk 環境

使用 Amazon Route 53 註冊新網域,或使用其他網域供應商將流量路由到您的 Elastic Beanstalk 環境。

如果您的環境網址包含區域,請建立別名名稱。如果您的環境網址不包含區域,請建立 CNAME 記錄。

**重要:**您可以將 CNAME 記錄用於您在 2016 年之前建立的環境。您無法將 CNAME 記錄與 Zone Apex 網域 (也稱為根網域或裸網域) 搭配使用。如需詳細資訊,請參閱別名與 CNAME 記錄的比較

然後 在 ACM 中建立憑證,或將第三方或自我簽署憑證和私有金鑰上傳至 IAM

將接聽程式新增至負載平衡器

請完成下列步驟:

  1. 開啟 Elastic Beanstalk console (Elastic Beanstalk 主控台)。
  2. 選取您的環境。
  3. 在導覽窗格中,選擇 Configuration (組態)。
  4. Load balancer (負載平衡器) 類別中,選擇 Modify (修改)。
  5. 若要新增連接埠 443 的接聽程式,請完成 Elastic Beanstalk 環境中有關負載平衡器的步驟。
    **注意:**最佳做法是使用 Application Load Balancer Network Load Balancer

**對於 Application Load Balancer **

請完成下列步驟:

  1. 選擇 Add Listener (新增接聽程式)。
  2. Port (連接埠) 中,輸入傳入流量連接埠。例如,443。
  3. Protocol (通訊協定) 中,選擇 HTTPS
  4. SSL certificate (SSL 憑證) 中,選取您的憑證,然後從下拉式清單中選擇 SSL policy (SSL 政策)。
  5. 選擇 Add (新增),然後選擇 Apply (套用)。

對於 Network Load Balancer

請完成下列步驟:

  1. 選擇 Add Listener (新增接聽程式)。
  2. Port (連接埠) 中,輸入傳入流量連接埠。例如,443。
  3. 選擇 Add (新增),然後選擇 Apply (套用)。

對於 Classic Load Balancer

請完成下列步驟:

  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 環境中的負載平衡器類型,使用下列其中一個組態檔案。
    對於 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

    對於 Network Load Balancer,請使用 .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-----

    注意:憑證檔案內容替換為您的憑證檔案內容,並將私有金鑰內容替換為您的私有金鑰內容。

    HTTPS 終止組態會根據您的解決方案堆疊而有所不同。任何解決方案堆疊的 .ebextensions 都會對 .ebextensions 中的私有金鑰和伺服器憑證的值進行硬式編碼。若要進一步保護這些檔案的安全,請將內容上傳至 Amazon Simple Storage Service (Amazon S3),然後使用 S3Auth 將其提取至 Amazon EC2

  5. 使用 files 金鑰在執行個體 /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-----

    注意:憑證檔案內容替換為您的憑證內容。 如果您有中間憑證,請將其包含在 server.crt 中的網站憑證之後。

  7. 使用 /etc/pki/tls/certs/server.key 在執行個體上建立私有金鑰檔案。
    注意:私有金鑰內容替換為用於建立憑證要求或自我簽署憑證的私有金鑰內容。

  8. 設定在執行個體上執行的 Proxy 伺服器,以終止 HTTPS。所有平台以統一的方式啟動 Proxy 伺服器組態。

  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

然後,設定在執行個體上執行的 Proxy 伺服器,以終止 HTTPS。

注意:HTTPS 終止組態會根據您的解決方案堆疊而有所不同。任何解決方案堆疊的 .ebextensions 都會對 .ebextensions 中的私有金鑰和伺服器憑證的值進行硬式編碼。若要進一步保護這些檔案的安全,請將內容上傳至 Amazon Simple Storage Service (Amazon S3),然後使用 S3Auth 將其提取至 Amazon EC2

若要將組態檔案部署至您的環境,請將組態檔案新增至應用程式套件根目錄下名為 .ebextensions 的目錄中。然後,部署包含組態檔案的原始程式碼。

AWS 官方已更新 9 個月前