

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 为 Elastic Beanstalk 环境配置 HTTPS
<a name="configuring-https"></a>

本节中的主题介绍如何为您的 Elastic Beanstalk 环境配置 HTTPS。HTTPS 是传输用户数据或登录信息的任何应用程序而言都必不可少。

如果您已为 Elastic Beanstalk 环境购买并配置了[自定义域名](customdomains.md)，您可以使用 HTTPS 来允许用户安全连接到网站。

如果您没有域名，仍可将包含自签名证书的 HTTPS 用于开发和测试目的。有关更多信息，请参阅 [服务器证书](configuring-https.certificate.md)。

**在负载均衡器上配置 HTTPS 终止**  
负载均衡器将请求分配到运行您的应用程序的 EC2 实例。负载均衡器还使您无需将实例直接公开在 Internet 上。在 Elastic Beanstalk 多实例环境中使用 HTTPS 的最简单方法是为负载均衡器配置一个安全侦听器。客户端和负载均衡器之间的连接仍然是安全的，因此您可以将负载均衡器配置为终止 HTTPS。负载均衡器和 EC2 实例之间的后端连接使用 HTTP，因此不需要实例的其他配置。有关配置安全侦听器的详细说明，请参阅 [在负载均衡器上配置 HTTPS 终止](configuring-https-elb.md)。

**在 EC2 实例上配置 HTTPS 终止**  
如果您在单实例环境中运行应用程序，或需要确保可一直连接到负载均衡器背后的 EC2 实例，您可配置在实例上运行的代理服务器以终止 HTTPS。配置实例以终止 HTTPS 连接要求使用[配置文件](ebextensions.md)来更改在实例上运行的软件，并修改安全组，以允许安全连接。有关更多信息，请参阅 [在实例上配置 HTTPS 终止](https-singleinstance.md)。

**配置 HTTPS end-to-end**  
对于负载平衡环境中的 end-to-end HTTPS，您可以结合使用实例和负载均衡器终止来加密两个连接。默认情况下，如果您使用 HTTPS 配置负载均衡器以转发流量，它将信任由后端实例向其提交的所有证书。为了实现最高安全性，您将策略与负载均衡器连接，避免其连接未提交其信任的公有证书的实例。有关更多信息，请参阅 [在负载均衡的 Elastic Beanstalk 环境中配置 end-to-end加密](configuring-https-endtoend.md)。

**为 HTTPS 配置 TCP 传递**  
 您也可将负载均衡器配置为传递 HTTPS 流量，无需解密。有关更多信息，请参阅 [为 TCP 传递配置环境的负载均衡器](https-tcp-passthrough.md)。

**注意**  
[它有蛇](https://github.com/awslabs/eb-tomcat-snakes)吗？ 上的示例应用程序 GitHub 包括使用 Tomcat Web 应用程序配置 HTTPS 的每种方法的配置文件和说明。请参阅 [readme](https://github.com/awslabs/eb-tomcat-snakes/blob/master/README.md) 文件和 [HTTPS 说明](https://github.com/awslabs/eb-tomcat-snakes/blob/master/src/.ebextensions/inactive/HTTPS.md)以了解详细信息。

**Topics**
+ [

# 服务器证书
](configuring-https.certificate.md)
+ [

# 在负载均衡器上配置 HTTPS 终止
](configuring-https-elb.md)
+ [

# 在实例上配置 HTTPS 终止
](https-singleinstance.md)
+ [

# 在负载均衡的 Elastic Beanstalk 环境中配置 end-to-end加密
](configuring-https-endtoend.md)
+ [

# 为 TCP 传递配置环境的负载均衡器
](https-tcp-passthrough.md)
+ [

# 配置 HTTP 到 HTTPS 重定向
](configuring-https-httpredirect.md)

# 服务器证书
<a name="configuring-https.certificate"></a>

本主题介绍可用于配置 HTTPS 的不同类型的证书以及何时应用每种证书。本节中的子主题提供了有关创建您自己的证书以及如何上传它的说明。

**AWS Certificate Manager (ACM)**  
ACM 是预置、管理和部署您的服务器证书的首选工具。您可以通过编程或使用. AWS CLI使用 ACM，您可为自己的域名免费创建可信证书。

 ACM 证书只能用于 AWS 负载均衡器和 Amazon CloudFront 分配，而且 ACM 仅在某些地区可用。 AWS 要将 ACM 证书与 Elastic Beanstalk 结合使用，请参阅[在负载均衡器上配置 HTTPS 终止](configuring-https-elb.md)。有关 ACM 的更多信息，请参阅《[https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html](https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html)》。

**注意**  
 有关可使用 ACM 的区域列表，请参阅 *Amazon Web Services 一般参考* 中的 [ACM endpoints and quotas](https://docs.aws.amazon.com/general/latest/gr/acm.html)。

如果 ACM 在您 AWS 所在的地区不可用，您可以将第三方或自签名证书和私钥上传到 AWS Identity and Access Management (IAM)。您可以使用 AWS CLI 上传证书。存储在 IAM 中的证书可用于负载均衡器和 CloudFront 分配。有关更多信息，请参阅 [上传证书至 IAM](configuring-https-ssl-upload.md)。

**第三方证书**  
如果 ACM 在您所在的区域不可用，您可从第三方购买的可信证书。第三方证书可用于在负载均衡器、后端实例或负载均衡器及后端实例上解密 HTTPS 流量。

**自签名证书**  
对于开发和测试，您可使用开源工具自行[创建和签署证书](configuring-https-ssl.md)。自签名证书可免费轻松创建，但无法用于公共站点的前端解密。如果您试图通过客户端为 HTTPS 连接使用自签名证书，用户的浏览器将会显示错误消息，表示网站不安全。但您可使用自签名证书来确保后端连接，不会出现问题。

# 创建和签名 X509 证书
<a name="configuring-https-ssl"></a>

您可以使用 `OpenSSL` 为应用程序创建 X509 证书。OpenSSL 一种支持广泛加密功能的标准开源库，其功能包括创建和签名 X509 证书。有关 OpenSSL 的更多信息，请访问 [www.openssl.org/](https://www.openssl.org/)。

**注意**  
如果要[在单实例环境中使用 HTTPS](https-singleinstance.md) 或使用自签名证书[在后端上重新加密](configuring-https-endtoend.md)，您只需在本地创建证书。如果您拥有域名，则可以使用 AWS Certificate Manager (ACM) 在中创建证书 AWS 并免费将其用于负载平衡的环境。有关说明，请参阅 *AWS Certificate Manager 用户指南*中的[请求证书](https://docs.aws.amazon.com/acm/latest/userguide/gs-acm-request.html)。

在命令行运行 `openssl version`，查看是否已安装 OpenSSL。如果你不这样做，你可以按照[公共 GitHub 存储库](https://github.com/openssl/openssl)中的说明来构建和安装源代码，或者使用你最喜欢的包管理器。[OpenSSL 也安装在 Elastic Beanstalk 的 Linux 映像上，因此一种快速的替代方法是使用 EB CLI 的命令连接到运行环境中的 EC2 实例：](eb-cli3.md)**eb ssh**

```
~/eb$ eb ssh
[ec2-user@ip-255-55-55-255 ~]$ openssl version
OpenSSL 1.0.1k-fips 8 Jan 2015
```

您需要创建 RSA 私有密钥才能创建证书签名请求 (CSR)。要创建私有密钥，请使用 **openssl genrsa** 命令：

```
[ec2-user@ip-255-55-55-255 ~]$ openssl genrsa 2048 > privatekey.pem
Generating RSA private key, 2048 bit long modulus
.................................................................................................................................+++
...............+++
e is 65537 (0x10001)
```

*privatekey.pem*  
要用于保存私有密钥的文件的名称。通常，**openssl genrsa** 命令将私有密钥内容输出到屏幕，但此命令将输出通过管道传送到文件。选择任何文件名，并将文件存储在安全位置，以便您以后可以检索它。如果您丢失私有密钥，则无法使用您的证书。

CSR 是指您为申请数字服务器证书而发送至证书颁发机构 (CA) 的文件。要创建 CSR，请使用 **openssl req** 命令：

```
$ openssl req -new -key privatekey.pem -out csr.pem
You are about to be asked to enter information that will be incorporated 
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
```

输入所请求的信息并按 **Enter**。下表描述并显示每个字段的示例。


****  

| Name | 说明 | 示例 | 
| --- | --- | --- | 
| 国家/地区名称 | 代表国家/地区的两个字母 ISO 缩写。 | US = 美国 | 
| 州或省 | 组织所在州或省的名称。不能缩写此名称。 | Washington | 
| 所在地名称 | 组织所在城市的名称。 | Seattle | 
| 组织名称 | 组织的法定全称。请勿缩写组织名称。 | Example Corporation | 
| 组织部门 | 可选，用于提供额外的组织信息。 | 市场营销 | 
| 公用名 | 网站的完全限定域名。这必须与用户访问站点时看到的域名相符，否则将显示证书错误。 | www.example.com | 
| 电子邮件地址 | 站点管理员的电子邮件地址。 | someone@example.com | 

您可向第三方提交签名请求以供签名，或自行签名以供开发和测试。自签名证书也可用于负载均衡器和 EC2 实例之间的后端 HTTPS。

要对证书进行签名，请使用 **openssl x509** 命令。以下示例使用上一步中的私钥 (*privatekey.pem*) 和签名请求 (*csr.pem*) 来创建有效期为*365*数天的名*public.crt*为的公有证书。

```
$ openssl x509 -req -days 365 -in csr.pem -signkey privatekey.pem -out public.crt
Signature ok
subject=/C=us/ST=washington/L=seattle/O=example corporation/OU=marketing/CN=www.example.com/emailAddress=someone@example.com
Getting Private key
```

保存私钥和公有证书以待将来使用。您可放弃签名请求。请始终[将私有密钥存储在安全位置](https-storingprivatekeys.md)并避免将其添加到源代码。

要将证书用于 Windows Server 平台，您必须将证书转换为 PFX 格式。使用以下命令可在私有密钥和公有证书文件中创建 PFX 证书：

```
$ openssl pkcs12 -export -out example.com.pfx -inkey privatekey.pem -in public.crt
Enter Export Password: password
Verifying - Enter Export Password: password
```

既然您已经拥有了证书，您可以[将其上传到 IAM](configuring-https-ssl-upload.md)以与负载均衡器结合使用，或者[在您的环境中配置实例以终止 HTTPS](https-singleinstance.md)。

# 上传证书至 IAM
<a name="configuring-https-ssl-upload"></a>

要将您的证书与 Elastic Beanstalk 环境的负载均衡器配合使用，请将证书和私 AWS Identity and Access Management 钥上传到 (IAM)。您可以将存储在 IAM 中的证书与 Elastic Load Balancing 负载均衡器和亚马逊 CloudFront 分配配合使用。

**注意**  
AWS Certificate Manager (ACM) 是预置、管理和部署服务器证书的首选工具。有关请求 ACM 证书的更多信息，请参阅 *AWS Certificate Manager 用户指南*中的[请求证书](https://docs.aws.amazon.com/acm/latest/userguide/gs-acm-request.html)。有关将第三方证书导入 ACM 中的更多信息，请参阅 *AWS Certificate Manager 用户指南*中的[导入证书](https://docs.aws.amazon.com/acm/latest/userguide/import-certificate.html)。只有在[您所在的 AWS 地区没有 ACM 时，才使用](https://docs.aws.amazon.com/general/latest/gr/acm.html) IAM 上传证书。

您可以使用 AWS Command Line Interface (AWS CLI) 上传您的证书。以下命令上传名为的自签名证书，*https-cert.crt*其私钥名为：*private-key.pem*

```
$ aws iam upload-server-certificate --server-certificate-name elastic-beanstalk-x509 --certificate-body file://https-cert.crt --private-key file://private-key.pem
{
    "ServerCertificateMetadata": {
        "ServerCertificateId": "AS5YBEIONO2Q7CAIHKNGC",
        "ServerCertificateName": "elastic-beanstalk-x509",
        "Expiration": "2017-01-31T23:06:22Z",
        "Path": "/",
        "Arn": "arn:aws:iam::123456789012:server-certificate/elastic-beanstalk-x509",
        "UploadDate": "2016-02-01T23:10:34.167Z"
    }
}
```

前`file://`缀告诉 AWS CLI 将文件内容加载到当前目录中。 *elastic-beanstalk-x509*指定在 IAM 中调用证书的名称。

如果您已从证书颁发机构购买了证书并已收到证书链文件，请包括 `--certificate-chain` 选项，将证书链文件同样上传：

```
$ aws iam upload-server-certificate --server-certificate-name elastic-beanstalk-x509 --certificate-chain file://certificate-chain.pem --certificate-body file://https-cert.crt --private-key file://private-key.pem
```

记下证书的 Amazon Resource Name (ARN)。当您更新负载均衡器配置设置以使用 HTTPS 时，您会使用它。

**注意**  
上传到 IAM 的证书保持存储状态，即使在任何环境的负载均衡器中不再使用它也如此。它包含敏感数据。当您对于任何环境都不再需要该证书时，请务必将其删除。有关从 IAM 中删除证书的详细信息，请参阅[https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_server-certs.html#delete-server-certificate](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_server-certs.html#delete-server-certificate)。

有关 IAM 中的服务器证书的更多信息，请参阅《*IAM 用户指南*》中的[使用服务器证书](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_server-certs.html)。

# 在 Amazon S3 中安全地存储私有密钥
<a name="https-storingprivatekeys"></a>

用于对公有证书签名的私有密钥是私有的，不应提交到源代码。通过将私有密钥上传到 Amazon S3，然后将 Elastic Beanstalk 配置为在应用程序部署期间从 Amazon S3 下载文件，可以避免将私有密钥存储在配置文件中。

以下示例显示了[配置文件](ebextensions.md)的[资源](environment-resources.md)和[文件](customize-containers-ec2.md#linux-files)部分，并从 Amazon S3 存储桶下载私有密钥文件。

**Example .ebextensions/privatekey.config**  

```
Resources:
  AWSEBAutoScalingGroup:
    Metadata:
      AWS::CloudFormation::Authentication:
        S3Auth:
          type: "s3"
          buckets: ["elasticbeanstalk-us-west-2-123456789012"]
          roleName: 
            "Fn::GetOptionSetting": 
              Namespace: "aws:autoscaling:launchconfiguration"
              OptionName: "IamInstanceProfile"
              DefaultValue: "aws-elasticbeanstalk-ec2-role"
files:
  # Private key
  "/etc/pki/tls/certs/server.key":
    mode: "000400"
    owner: root
    group: root
    authentication: "S3Auth"
    source: https://elasticbeanstalk-us-west-2-123456789012.s3.us-west-2.amazonaws.com/server.key
```

将示例中的存储桶名称和 URL 替换为您自己的。此文件中的第一个条目将名为 `S3Auth` 的身份验证方法添加到环境的 Auto Scaling 组的元数据中。如果您为环境配置了自定义[实例配置文件](concepts-roles-instance.md)，则将使用自定义实例配置文件，否则应用默认值 `aws-elasticbeanstalk-ec2-role`。默认实例配置文件具有从 Elastic Beanstalk 存储桶读取的权限。如果您使用不同的存储桶，请[向实例配置文件添加权限](iam-instanceprofile.md#iam-instanceprofile-addperms)。

第二个条目使用 `S3Auth` 身份验证方法从指定 URL 下载私有密钥并将其保存到 `/etc/pki/tls/certs/server.key`。然后，代理服务器可以从此位置读取私有密钥以[终止实例的 HTTPS 连接](https-singleinstance.md)。

分配给您的环境实例的 EC2 实例配置文件必须具有从指定存储桶读取密钥对象的权限。[验证实例配置文件有权](iam-instanceprofile.md#iam-instanceprofile-verify)读取 IAM 中的对象，并且存储桶和对象上的权限不禁止实例配置文件。

**查看存储桶的权限**

1. 打开 [Amazon S3 管理控制台](https://console.aws.amazon.com/s3/home)。

1. 选择存储桶。

1. 选择**属性**，然后选择**权限**。

1. 验证您的账户已被授予存储桶的读取权限。

1. 如果已附加存储桶策略，请选择**存储桶策略**以查看分配到存储桶的权限。

# 在负载均衡器上配置 HTTPS 终止
<a name="configuring-https-elb"></a>

要更新您的 AWS Elastic Beanstalk 环境以使用 HTTPS，您需要为环境中的负载均衡器配置 HTTPS 侦听器。两种类型的负载均衡器支持 HTTPS 侦听器：经典负载均衡器和 Application Load Balancer。

您可以使用 Elastic Beanstalk 控制台或配置文件配置安全侦听器和分配证书。

**注意**  
单实例环境没有负载均衡器并且不支持负载均衡器上的 HTTPS 终止。

## 使用 Elastic Beanstalk 控制台配置安全侦听器
<a name="configuring-https-elb.console"></a>

**将证书分配至环境的负载均衡器**

1. 打开 [Elastic Beanstalk](https://console.aws.amazon.com/elasticbeanstalk) 控制台，然后**在 “区域” 列表中，选择您**的。 AWS 区域

1. 在导航窗格中，选择 **Environments**（环境），然后从列表中选择环境的名称。

1. 在导航窗格中，选择 **Configuration**（配置）。

1. 在 **Load balancer (负载均衡器)** 配置类别中，选择 **Edit (编辑)**。
**注意**  
如果 **Load balancer (负载均衡器)** 配置类别没有 **Edit (编辑)** 按钮，则表示您的环境没有[负载均衡器](using-features-managing-env-types.md#using-features.managing.changetype)。

1. 在**修改负载均衡器**页上，根据与您的环境关联的负载均衡器类型，该过程将会有所不同。
   + **经典负载均衡器**

     1. 选择**添加侦听器**。

     1. 在 **经典负载均衡器 listener (经典负载均衡器侦听器)** 对话框中，配置以下设置：
        + 对于**侦听器端口**，请键入传入流量端口，通常为 `443`。
        + 对于**侦听器协议**，选择 **HTTPS**。
        + 对于**实例端口**，请键入 `80`。
        + 对于**实例协议**，选择 **HTTP**。
        + 对于 **SSL 证书**，选择您的证书。

     1. 选择**添加**。
   + **应用程序负载均衡器**

     1. 选择**添加侦听器**。

     1. 在 **Application Load Balancer listener (Application Load Balancer 侦听器)** 对话框中，配置以下设置：
        + 对于**端口**，请键入传入流量端口，通常为 `443`。
        + 对于**协议**，选择 **HTTPS**。
        + 对于 **SSL 证书**，选择您的证书。

     1. 选择**添加**。
**注意**  
对于经典负载均衡器和应用程序负载均衡器，如果下拉菜单中未显示任何证书，您应在 [AWS Certificate Manager (ACM)](https://docs.aws.amazon.com/acm/latest/userguide/) 中为您的[自定义域名](customdomains.md)创建或上传证书（首选）。或者，使用 AWS CLI将证书上传到 IAM。
   + **Network Load Balancer**

     1. 选择**添加侦听器**。

     1. 在 **Network Load Balancer listener (Network Load Balancer 侦听器)** 对话框中，对于 **Port (端口)**，请键入传入流量端口，通常为 `443`。

     1. 选择**添加**。

1. 要保存更改，请选择页面底部的 **Apply**（应用）。

## 使用配置文件配置安全侦听器
<a name="configuring-https-elb.configurationfile"></a>

您可以使用以下[配置文件](ebextensions.md)之一在负载均衡器上配置安全侦听器。

**Example .ebextensions/securelistener-clb.config**  
当您的环境具有经典负载均衡器时，请使用此示例。该示例使用 `aws:elb:listener` 命名空间中的选项通过指定的证书在端口 443 上配置 HTTPS 侦听器，并将解密的流量转发到端口 80 上的环境实例。  

```
option_settings:
  aws:elb:listener:443:
    SSLCertificateId: arn:aws:acm:us-east-2:1234567890123:certificate/####################################
    ListenerProtocol: HTTPS
    InstancePort: 80
```

将突出显示的文本替换为您的证书的 ARN。该证书可以是您在 AWS Certificate Manager (ACM) 中创建或上传的证书（首选），也可以是您使用上传到 IAM 的 AWS CLI证书。

有关经典负载均衡器配置选项的更多信息，请参阅[经典负载均衡器配置命名空间](environments-cfg-clb.md#environments-cfg-clb-namespace)。

**Example .ebextensions/securelistener-alb.config**  
当您的环境具有 Application Load Balancer 时，请使用此示例。该示例使用 `aws:elbv2:listener` 命名空间中的选项通过指定的证书在端口 443 上配置 HTTPS 侦听器。该侦听器将流量路由到默认进程。  

```
option_settings:
  aws:elbv2:listener:443:
    ListenerEnabled: 'true'
    Protocol: HTTPS
    SSLCertificateArns: arn:aws:acm:us-east-2:1234567890123:certificate/####################################
```

**Example .ebextensions/securelistener-nlb.config**  
当您的环境具有 Network Load Balancer 时，请使用此示例。该示例使用 `aws:elbv2:listener` 命名空间中的选项在端口 443 上配置侦听器。该侦听器将流量路由到默认进程。  

```
option_settings:
  aws:elbv2:listener:443:
    ListenerEnabled: 'true'
```

## 配置安全组
<a name="configuring-https-elb.security-group"></a>

如果将负载均衡器配置为将流量转发到除端口 80 外的实例端口，则必须向安全组添加一个规则来允许来自负载均衡器的入站流量通过该实例端口。如果您在自定义 VPC 中创建环境，则 Elastic Beanstalk 会为您添加此规则。

您可以在 `.ebextensions` 目录的[配置文件](ebextensions.md)中为您的应用程序添加 `Resources` 键，从而添加此规则。

以下示例配置文件添加传入规则到 `AWSEBSecurityGroup` 安全组。这样将允许端口 1000 上来自负载均衡器安全组的流量。

**Example .ebextensions/sg-ingressfromlb.config**  

```
Resources:
  sslSecurityGroupIngress:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]}
      IpProtocol: tcp
      ToPort: 1000
      FromPort: 1000
      SourceSecurityGroupId: {"Fn::GetAtt" : ["AWSEBLoadBalancerSecurityGroup", "GroupId"]}
```

# 在实例上配置 HTTPS 终止
<a name="https-singleinstance"></a>

您可使用[配置文件](ebextensions.md)配置将流量传递至应用程序的代理服务器，使其终止 HTTPS 连接。如果您希望在单一实例环境中使用 HTTPS，或如果您配置负载均衡器为传递流量而无需解密，这种方式将会十分有用。

要启用 HTTPS，您必须允许端口 443 上的传入流量流向运行 Elastic Beanstalk 应用程序的 EC2 实例。为此，您可以使用配置文件中的`Resources`密钥将端口 443 的规则添加到 AWSEBSecurity组安全组的入口规则中。

以下代码段将传入规则添加到 `AWSEBSecurityGroup` 安全组，该安全组为单一实例环境的所有流量打开端口 443。

**`.ebextensions/https-instance-securitygroup.config`**

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

在默认 [Amazon Virtual Private Cloud](https://docs.aws.amazon.com/vpc/latest/userguide/) (Amazon VPC) 的负载均衡环境中，您可以将此策略修改为仅接受来自负载均衡器的流量。有关示例，请参阅 [在负载均衡的 Elastic Beanstalk 环境中配置 end-to-end加密](configuring-https-endtoend.md)。

**Topics**
+ [

# 在运行 Docker 的 EC2 实例上终止 HTTPS
](https-singleinstance-docker.md)
+ [

# 在运行 Go 的 EC2 实例上终止 HTTPS
](https-singleinstance-go.md)
+ [

# 终止运行 Java SE 的 EC2 实例上的 HTTPS
](https-singleinstance-java.md)
+ [

# 在运行 Node.js 的 EC2 实例上终止 HTTPS
](https-singleinstance-nodejs.md)
+ [

# 在运行 PHP 的 EC2 实例上终止 HTTPS
](https-singleinstance-php.md)
+ [

# 在运行 Python 的 EC2 实例上终止 HTTPS
](https-singleinstance-python.md)
+ [

# 在运行 Ruby 的 EC2 实例上终止 HTTPS
](https-singleinstance-ruby.md)
+ [

# 在运行 Tomcat 的 EC2 实例上终止 HTTPS
](https-singleinstance-tomcat.md)
+ [

# 在运行 .NET Core on Linux 的 Amazon EC2 实例上终止 HTTPS
](https-singleinstance-dotnet-linux.md)
+ [

# 在运行.NET 的亚马逊 EC2 实例上终止 HTTPS
](SSLNET.SingleInstance.md)

# 在运行 Docker 的 EC2 实例上终止 HTTPS
<a name="https-singleinstance-docker"></a>

对于 Docker 容器，您使用[配置文件](ebextensions.md)启用 HTTPS。

将以下代码段添加到您的配置文件中，按照提示替换证书和私有密钥资料，并将该文件保存在源包的 `.ebextensions` 目录中。该配置文件执行以下任务：
+ `files` 密钥在实例上创建以下文件：  
`/etc/nginx/conf.d/https.conf`  
配置 nginx 服务器。nginx 服务启动时加载此文件。  
`/etc/pki/tls/certs/server.crt`  
在实例上创建证书文件。*certificate file contents*替换为证书的内容。  
YAML 依赖一致的缩进。当替换示例配置文件中的内容时，应匹配缩进级别，并且确保您的文本编辑器使用空格而不是字符来进行缩进。
如果您有中间证书，请将其放入 `server.crt` 中您的站点证书的后面：  

  ```
        -----BEGIN CERTIFICATE-----
    certificate file contents
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    first intermediate certificate
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    second intermediate certificate
    -----END CERTIFICATE-----
  ```  
`/etc/pki/tls/certs/server.key`  
在实例上创建私有密钥文件。*private key contents*替换为用于创建证书请求或自签名证书的私钥内容。

**Example .ebextensions/https-instance.config**  

```
files:
  /etc/nginx/conf.d/https.conf:
    mode: "000644"
    owner: root
    group: root
    content: |
      # HTTPS Server
      
      server {
        listen 443;
        server_name localhost;
        
        ssl on;
        ssl_certificate /etc/pki/tls/certs/server.crt;
        ssl_certificate_key /etc/pki/tls/certs/server.key;
        
        ssl_session_timeout 5m;
        
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        
        location / {
          proxy_pass http://docker;
          proxy_http_version 1.1;
          
          proxy_set_header Connection "";
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Proto https;
        }
      }
      
  /etc/pki/tls/certs/server.crt:
    mode: "000400"
    owner: root
    group: root
    content: |
      -----BEGIN CERTIFICATE-----
      certificate file contents
      -----END CERTIFICATE-----
      
  /etc/pki/tls/certs/server.key:
    mode: "000400"
    owner: root
    group: root
    content: |
      -----BEGIN RSA PRIVATE KEY-----
      private key contents # See note below.
      -----END RSA PRIVATE KEY-----
```

**注意**  
避免将包含私有密钥的配置文件提交到源控件。在测试完配置并确认其有效后，请在 Amazon S3 中存储私有密钥并修改配置以在部署期间下载该密钥。有关说明，请参阅[在 Amazon S3 中安全地存储私有密钥](https-storingprivatekeys.md)。

在单实例环境中，您还必须修改实例的安全组，以便允许端口 443 上的流量。以下配置文件使用 CloudFormation [函数](ebextensions-functions.md)检索安全组的 ID 并向其添加规则。

**Example .ebextensions/ .config https-instance-single**  

```
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-tcp-passthrough.md)[加密](configuring-https-endtoend.md)。 end-to-end

# 在运行 Go 的 EC2 实例上终止 HTTPS
<a name="https-singleinstance-go"></a>

对于 Go 容器类型，您可以使用[配置文件](ebextensions.md)和 nginx 配置文件（用于将 nginx 服务器配置为使用 HTTPS）来启用 HTTPS。

将以下代码段添加到您的配置文件中，按照提示替换证书和私有密钥占位符，并将该文件保存在源包的 `.ebextensions` 目录中。该配置文件执行以下任务：
+ `Resources` 密钥在您的环境实例使用的安全组上启用端口 443。
+ `files` 密钥在实例上创建以下文件：  
`/etc/pki/tls/certs/server.crt`  
在实例上创建证书文件。*certificate file contents*替换为证书的内容。  
YAML 依赖一致的缩进。当替换示例配置文件中的内容时，应匹配缩进级别，并且确保您的文本编辑器使用空格而不是字符来进行缩进。
如果您有中间证书，请将其放入 `server.crt` 中您的站点证书的后面：  

  ```
        -----BEGIN CERTIFICATE-----
    certificate file contents
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    first intermediate certificate
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    second intermediate certificate
    -----END CERTIFICATE-----
  ```  
`/etc/pki/tls/certs/server.key`  
在实例上创建私有密钥文件。*private key contents*替换为用于创建证书请求或自签名证书的私钥内容。

**Example .ebextensions/https-instance.config**  

```
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 # See note below.
      -----END RSA PRIVATE KEY-----
```

**注意**  
避免将包含私有密钥的配置文件提交到源控件。在测试完配置并确认其有效后，请在 Amazon S3 中存储私有密钥并修改配置以在部署期间下载该密钥。有关说明，请参阅[在 Amazon S3 中安全地存储私有密钥](https-storingprivatekeys.md)。

将以下内容放置在源包的 `.conf` 目录内扩展名为 `.ebextensions/nginx/conf.d/` 的文件中 (例如 `.ebextensions/nginx/conf.d/https.conf`)。*app\$1port*替换为应用程序监听的端口号。此示例配置 nginx 服务器使用 SSL 侦听端口 443。有关 Go 平台上的这些配置文件的更多信息，请参阅 [配置代理服务器](go-nginx.md)。

**Example 。 ebextensions/nginx/conf.d/https.conf**  

```
# HTTPS server

server {
    listen       443;
    server_name  localhost;
    
    ssl                  on;
    ssl_certificate      /etc/pki/tls/certs/server.crt;
    ssl_certificate_key  /etc/pki/tls/certs/server.key;
    
    ssl_session_timeout  5m;
    
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers   on;
    
    location / {
        proxy_pass  http://localhost:app_port;
        proxy_set_header   Connection "";
        proxy_http_version 1.1;
        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto https;
    }
}
```

在单实例环境中，您还必须修改实例的安全组，以便允许端口 443 上的流量。以下配置文件使用 CloudFormation [函数](ebextensions-functions.md)检索安全组的 ID 并向其添加规则。

**Example .ebextensions/ .config https-instance-single**  

```
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-tcp-passthrough.md)[加密](configuring-https-endtoend.md)。 end-to-end

# 终止运行 Java SE 的 EC2 实例上的 HTTPS
<a name="https-singleinstance-java"></a>

对于 Java SE 容器类型，您可使用 .ebextensions [配置文件](ebextensions.md)和 nginx 配置文件（用于将 nginx 服务器配置为使用 HTTPS）来启用 HTTPS。

所有 AL2023/AL2 平台都支持统一的代理配置功能。有关在运行 AL2023 /的平台版本上配置代理服务器的更多信息AL2，请参阅[反向代理配置](platforms-linux-extend.proxy.md)。

将以下代码段添加到您的配置文件中，按照提示替换证书和私有密钥占位符，并将该文件保存在 `.ebextensions` 目录中。该配置文件执行以下任务：
+ `files` 密钥在实例上创建以下文件：  
`/etc/pki/tls/certs/server.crt`  
在实例上创建证书文件。*certificate file contents*替换为证书的内容。  
YAML 依赖一致的缩进。当替换示例配置文件中的内容时，应匹配缩进级别，并且确保您的文本编辑器使用空格而不是字符来进行缩进。
如果您有中间证书，请将其放入 `server.crt` 中您的站点证书的后面：  

  ```
        -----BEGIN CERTIFICATE-----
    certificate file contents
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    first intermediate certificate
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    second intermediate certificate
    -----END CERTIFICATE-----
  ```  
`/etc/pki/tls/certs/server.key`  
在实例上创建私有密钥文件。*private key contents*替换为用于创建证书请求或自签名证书的私钥内容。

**Example .ebextensions/https-instance.config**  

```
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 # See note below.
      -----END RSA PRIVATE KEY-----
```

**注意**  
避免将包含私有密钥的配置文件提交到源控件。在测试完配置并确认其有效后，请在 Amazon S3 中存储私有密钥并修改配置以在部署期间下载该密钥。有关说明，请参阅[在 Amazon S3 中安全地存储私有密钥](https-storingprivatekeys.md)。

将以下内容放置在源包的 `.conf` 目录内扩展名为 `.ebextensions/nginx/conf.d/` 的文件中 (例如 `.ebextensions/nginx/conf.d/https.conf`)。*app\$1port*替换为应用程序监听的端口号。此示例配置 nginx 服务器使用 SSL 侦听端口 443。有关 Java SE 平台上的这些配置文件的更多信息，请参阅 [配置代理服务器](java-se-nginx.md)。

**Example 。 ebextensions/nginx/conf.d/https.conf**  

```
# HTTPS server

server {
    listen       443;
    server_name  localhost;
    
    ssl                  on;
    ssl_certificate      /etc/pki/tls/certs/server.crt;
    ssl_certificate_key  /etc/pki/tls/certs/server.key;
    
    ssl_session_timeout  5m;
    
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers   on;
    
    location / {
        proxy_pass  http://localhost:app_port;
        proxy_set_header   Connection "";
        proxy_http_version 1.1;
        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto https;
    }
}
```

在单实例环境中，您还必须修改实例的安全组，以便允许端口 443 上的流量。以下配置文件使用 CloudFormation [函数](ebextensions-functions.md)检索安全组的 ID 并向其添加规则。

**Example .ebextensions/ .config https-instance-single**  

```
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-tcp-passthrough.md)[加密](configuring-https-endtoend.md)。 end-to-end

# 在运行 Node.js 的 EC2 实例上终止 HTTPS
<a name="https-singleinstance-nodejs"></a>

以下示例配置文件[扩展了默认 nginx](nodejs-platform-proxy.md) 配置，使其监听端口 443 并 SSL/TLS 终止使用公有证书和私钥的连接。

如果已为[增强型运行状况报告](health-enhanced.md)配置环境，则需要配置 nginx 以生成访问日志。为此，通过删除前导 `# For enhanced health...` 字符，在显示为 `#` 的注释下方取消对行块的注释。

**Example .ebextensions/https-instance.config**  

```
files:
  /etc/nginx/conf.d/https.conf:
    mode: "000644"
    owner: root
    group: root
    content: |
      # HTTPS server

      server {
          listen       443;
          server_name  localhost;
          
          ssl                  on;
          ssl_certificate      /etc/pki/tls/certs/server.crt;
          ssl_certificate_key  /etc/pki/tls/certs/server.key;
          
          ssl_session_timeout  5m;
          
          ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
          ssl_prefer_server_ciphers   on;

          # For enhanced health reporting support, uncomment this block:

          #if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})") {
          #    set $year $1;
          #    set $month $2;
          #    set $day $3;
          #    set $hour $4;
          #}
          #access_log /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd;
          #access_log  /var/log/nginx/access.log  main;
          
          location / {
              proxy_pass  http://nodejs;
              proxy_set_header   Connection "";
              proxy_http_version 1.1;
              proxy_set_header        Host            $host;
              proxy_set_header        X-Real-IP       $remote_addr;
              proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header        X-Forwarded-Proto https;
          }
      }
      
  /etc/pki/tls/certs/server.crt:
    mode: "000400"
    owner: root
    group: root
    content: |
      -----BEGIN CERTIFICATE-----
      certificate file contents
      -----END CERTIFICATE-----
      
  /etc/pki/tls/certs/server.key:
    mode: "000400"
    owner: root
    group: root
    content: |
      -----BEGIN RSA PRIVATE KEY-----
      private key contents # See note below.
      -----END RSA PRIVATE KEY-----
```

`files` 密钥在实例上创建以下文件：

`/etc/nginx/conf.d/https.conf`  
配置 nginx 服务器。nginx 服务启动时加载此文件。

`/etc/pki/tls/certs/server.crt`  
在实例上创建证书文件。*certificate file contents*替换为证书的内容。  
YAML 依赖一致的缩进。当替换示例配置文件中的内容时，应匹配缩进级别，并且确保您的文本编辑器使用空格而不是字符来进行缩进。
如果您有中间证书，请将其放入 `server.crt` 中您的站点证书的后面：  

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

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

**注意**  
避免将包含私有密钥的配置文件提交到源控件。在测试完配置并确认其有效后，请在 Amazon S3 中存储私有密钥并修改配置以在部署期间下载该密钥。有关说明，请参阅[在 Amazon S3 中安全地存储私有密钥](https-storingprivatekeys.md)。

在单实例环境中，您还必须修改实例的安全组，以便允许端口 443 上的流量。以下配置文件使用 CloudFormation [函数](ebextensions-functions.md)检索安全组的 ID 并向其添加规则。

**Example .ebextensions/ .config https-instance-single**  

```
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-tcp-passthrough.md)[加密](configuring-https-endtoend.md)。 end-to-end

# 在运行 PHP 的 EC2 实例上终止 HTTPS
<a name="https-singleinstance-php"></a>

对于 PHP 容器类型，您可使用[配置文件](ebextensions.md)来允许 Apache HTTP Server 使用 HTTPS。

将以下代码段添加到您的配置文件中，按照提示替换证书和私有密钥资料，并将该文件保存在源包的 `.ebextensions` 目录中。

该配置文件执行以下任务：
+ `packages` 密钥使用 yum 安装 `mod24_ssl`。
+ `files` 密钥在实例上创建以下文件：  
`/etc/httpd/conf.d/ssl.conf`  
配置 Apache 服务器。此文件在 Apache 服务启动时加载。  
`/etc/pki/tls/certs/server.crt`  
在实例上创建证书文件。*certificate file contents*替换为证书的内容。  
YAML 依赖一致的缩进。当替换示例配置文件中的内容时，应匹配缩进级别，并且确保您的文本编辑器使用空格而不是字符来进行缩进。
如果您有中间证书，请将其放入 `server.crt` 中您的站点证书的后面：  

  ```
        -----BEGIN CERTIFICATE-----
    certificate file contents
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    first intermediate certificate
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    second intermediate certificate
    -----END CERTIFICATE-----
  ```  
`/etc/pki/tls/certs/server.key`  
在实例上创建私有密钥文件。*private key contents*替换为用于创建证书请求或自签名证书的私钥内容。

**Example .ebextensions/https-instance.config**  

```
packages:
  yum:
    mod24_ssl : []

files:
  /etc/httpd/conf.d/ssl.conf:
    mode: "000644"
    owner: root
    group: root
    content: |
      LoadModule ssl_module modules/mod_ssl.so
      Listen 443
      <VirtualHost *:443>
        <Proxy *>
          Order deny,allow
          Allow from all
        </Proxy>

        SSLEngine             on
        SSLCertificateFile    "/etc/pki/tls/certs/server.crt"
        SSLCertificateKeyFile "/etc/pki/tls/certs/server.key"
        SSLCipherSuite        EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
        SSLProtocol           All -SSLv2 -SSLv3
        SSLHonorCipherOrder   On
        SSLSessionTickets     Off
        
        Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
        Header always set X-Frame-Options DENY
        Header always set X-Content-Type-Options nosniff
        
        ProxyPass / http://localhost:80/ retry=0
        ProxyPassReverse / http://localhost:80/
        ProxyPreserveHost on
        RequestHeader set X-Forwarded-Proto "https" early
        
      </VirtualHost>
      
  /etc/pki/tls/certs/server.crt:
    mode: "000400"
    owner: root
    group: root
    content: |
      -----BEGIN CERTIFICATE-----
      certificate file contents
      -----END CERTIFICATE-----
      
  /etc/pki/tls/certs/server.key:
    mode: "000400"
    owner: root
    group: root
    content: |
      -----BEGIN RSA PRIVATE KEY-----
      private key contents # See note below.
      -----END RSA PRIVATE KEY-----
```

**注意**  
避免将包含私有密钥的配置文件提交到源控件。在测试完配置并确认其有效后，请在 Amazon S3 中存储私有密钥并修改配置以在部署期间下载该密钥。有关说明，请参阅[在 Amazon S3 中安全地存储私有密钥](https-storingprivatekeys.md)。

在单实例环境中，您还必须修改实例的安全组，以便允许端口 443 上的流量。以下配置文件使用 CloudFormation [函数](ebextensions-functions.md)检索安全组的 ID 并向其添加规则。

**Example .ebextensions/ .config https-instance-single**  

```
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-tcp-passthrough.md)[加密](configuring-https-endtoend.md)。 end-to-end

# 在运行 Python 的 EC2 实例上终止 HTTPS
<a name="https-singleinstance-python"></a>

对于使用 Apache HTTP Server 和 Web Server Gateway Interface (WSGI) 的 Python 容器类型，您可使用[配置文件](ebextensions.md)来允许 Apache HTTP Server 使用 HTTPS。

将以下代码段添加到您的[配置文件](ebextensions.md)中，按照提示替换证书和私有密钥资料，并将该文件保存在源包的 `.ebextensions` 目录中。该配置文件执行以下任务：
+ `packages` 密钥使用 yum 安装 `mod_ssl`。
+ `files` 密钥在实例上创建以下文件：  
`/etc/httpd/conf.d/ssl.conf`  
配置 Apache 服务器。如果您的应用程序的名称不是 `application.py`，请将 `WSGIScriptAlias` 的值中突出显示的文本替换为您的应用程序的本地路径。例如，django 应用程序的路径可能是 `django/wsgi.py`。此位置应与您为环境设置的 `WSGIPath` 选项值相符。  
根据您的应用程序的要求，您可能还需要向 **python-path** 参数添加其他目录。  
`/etc/pki/tls/certs/server.crt`  
在实例上创建证书文件。*certificate file contents*替换为证书的内容。  
YAML 依赖一致的缩进。当替换示例配置文件中的内容时，应匹配缩进级别，并且确保您的文本编辑器使用空格而不是字符来进行缩进。
如果您有中间证书，请将其放入 `server.crt` 中您的站点证书的后面：  

  ```
        -----BEGIN CERTIFICATE-----
    certificate file contents
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    first intermediate certificate
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    second intermediate certificate
    -----END CERTIFICATE-----
  ```  
`/etc/pki/tls/certs/server.key`  
在实例上创建私有密钥文件。*private key contents*替换为用于创建证书请求或自签名证书的私钥内容。
+ `container_commands` 密钥在一切配置完成后停止 httpd 服务，以便该服务使用新的 `https.conf` 文件和证书。

**注意**  
该示例仅可用于使用 [Python](create-deploy-python-container.md) 平台的环境。

**Example .ebextensions/https-instance.config**  

```
packages:
  yum:
    mod_ssl: []
    
files:
  /etc/httpd/conf.d/ssl.conf:
    mode: "000644"
    owner: root
    group: root
    content: |
      LoadModule wsgi_module modules/mod_wsgi.so
      WSGIPythonHome /var/app/venv/staging-LQM1lest
      WSGISocketPrefix run/wsgi
      WSGIRestrictEmbedded On
      Listen 443
      <VirtualHost *:443>
        SSLEngine on
        SSLCertificateFile "/etc/pki/tls/certs/server.crt"
        SSLCertificateKeyFile "/etc/pki/tls/certs/server.key"
        
        Alias /static/ /var/app/current/static/
        <Directory /var/app/current/static>
        Order allow,deny
        Allow from all
        </Directory>
        
        WSGIScriptAlias / /var/app/current/application.py
        
        <Directory /var/app/current>
        Require all granted
        </Directory>
        
        WSGIDaemonProcess wsgi-ssl processes=1 threads=15 display-name=%{GROUP} \
          python-path=/var/app/current \
          python-home=/var/app/venv/staging-LQM1lest \
          home=/var/app/current \
          user=webapp \
          group=webapp
        WSGIProcessGroup wsgi-ssl
        
      </VirtualHost>
      
  /etc/pki/tls/certs/server.crt:
    mode: "000400"
    owner: root
    group: root
    content: |
      -----BEGIN CERTIFICATE-----
      certificate file contents
      -----END CERTIFICATE-----
       
  /etc/pki/tls/certs/server.key:
    mode: "000400"
    owner: root
    group: root
    content: |
      -----BEGIN RSA PRIVATE KEY-----
      private key contents # See note below.
      -----END RSA PRIVATE KEY-----
      
container_commands:
  01killhttpd:
    command: "killall httpd"
  02waitforhttpddeath:
    command: "sleep 3"
```

**注意**  
避免将包含私有密钥的配置文件提交到源控件。在测试完配置并确认其有效后，请在 Amazon S3 中存储私有密钥并修改配置以在部署期间下载该密钥。有关说明，请参阅[在 Amazon S3 中安全地存储私有密钥](https-storingprivatekeys.md)。

**Amazon Linux 2023 环境注意事项**  
在 Amazon Linux 2023 上，必须单独安装 `mod_wsgi`，因为它在软件包存储库中不可用。有关安装说明，请参阅 PyPI 上的 [mod\$1wsgi](https://pypi.org/project/mod-wsgi/)。

在单实例环境中，您还必须修改实例的安全组，以便允许端口 443 上的流量。以下配置文件使用 CloudFormation [函数](ebextensions-functions.md)检索安全组的 ID 并向其添加规则。

**Example .ebextensions/ .config https-instance-single**  

```
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-tcp-passthrough.md)[加密](configuring-https-endtoend.md)。 end-to-end

# 在运行 Ruby 的 EC2 实例上终止 HTTPS
<a name="https-singleinstance-ruby"></a>

对于 Ruby 容器类型，启用 HTTPS 的方式取决于所用应用程序服务器的类型。

**Topics**
+ [

## 为使用 Puma 的 Ruby 配置 HTTPS
](#Puma)
+ [

## 为使用 Passenger 的 Ruby 配置 HTTPS
](#Passenger)

## 为使用 Puma 的 Ruby 配置 HTTPS
<a name="Puma"></a>

对于使用 Puma 作为应用程序服务器的 Ruby 容器类型，您可使用[配置文件](ebextensions.md)启用 HTTPS。

将以下代码段添加到您的配置文件中，按照提示替换证书和私有密钥资料，并将该文件保存在源包的 `.ebextensions` 目录中。该配置文件执行以下任务：
+ `files` 密钥在实例上创建以下文件：  
`/etc/nginx/conf.d/https.conf`  
配置 nginx 服务器。nginx 服务启动时加载此文件。  
`/etc/pki/tls/certs/server.crt`  
在实例上创建证书文件。*certificate file contents*替换为证书的内容。  
YAML 依赖一致的缩进。当替换示例配置文件中的内容时，应匹配缩进级别，并且确保您的文本编辑器使用空格而不是字符来进行缩进。
如果您有中间证书，请将其放入 `server.crt` 中您的站点证书的后面：  

  ```
        -----BEGIN CERTIFICATE-----
    certificate file contents
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    first intermediate certificate
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    second intermediate certificate
    -----END CERTIFICATE-----
  ```  
`/etc/pki/tls/certs/server.key`  
在实例上创建私有密钥文件。*private key contents*替换为用于创建证书请求或自签名证书的私钥内容。

**Example .ebextensions/https-instance.config**  

```
files:
  /etc/nginx/conf.d/https.conf:
    content: |
      # HTTPS server

      server {
          listen       443;
          server_name  localhost;
          
          ssl                  on;
          ssl_certificate      /etc/pki/tls/certs/server.crt;
          ssl_certificate_key  /etc/pki/tls/certs/server.key;
          
          ssl_session_timeout  5m;
          
          ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
          ssl_prefer_server_ciphers   on;
          
          location / {
              proxy_pass  http://my_app;
              proxy_set_header        Host            $host;
              proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header        X-Forwarded-Proto https;
          }

          location /assets {
            alias /var/app/current/public/assets;
            gzip_static on;
            gzip on;
            expires max;
            add_header Cache-Control public;
          }

          location /public {
            alias /var/app/current/public;
            gzip_static on;
            gzip on;
            expires max;
            add_header Cache-Control public;
          }
      }

  /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 # See note below.
      -----END RSA PRIVATE KEY-----
```

**注意**  
避免将包含私有密钥的配置文件提交到源控件。在测试完配置并确认其有效后，请在 Amazon S3 中存储私有密钥并修改配置以在部署期间下载该密钥。有关说明，请参阅[在 Amazon S3 中安全地存储私有密钥](https-storingprivatekeys.md)。

在单实例环境中，您还必须修改实例的安全组，以便允许端口 443 上的流量。以下配置文件使用 CloudFormation [函数](ebextensions-functions.md)检索安全组的 ID 并向其添加规则。

**Example .ebextensions/ .config https-instance-single**  

```
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-tcp-passthrough.md)[加密](configuring-https-endtoend.md)。 end-to-end

## 为使用 Passenger 的 Ruby 配置 HTTPS
<a name="Passenger"></a>

对于使用 Passenger 作为应用程序服务器的 Ruby 容器类型，您可同时使用配置文件和 JSON 文件启用 HTTPS。

**为使用 Passenger 的 Ruby 配置 HTTPS**

1. 将以下代码段添加到您的配置文件中，按照提示替换证书和私有密钥资料，并将该文件保存在源包的 `.ebextensions` 目录中。该配置文件执行以下任务：
   + `files` 密钥在实例上创建以下文件：  
`/etc/pki/tls/certs/server.crt`  
在实例上创建证书文件。*certificate file contents*替换为证书的内容。  
YAML 依赖一致的缩进。当替换示例配置文件中的内容时，应匹配缩进级别，并且确保您的文本编辑器使用空格而不是字符来进行缩进。
如果您有中间证书，请将其放入 `server.crt` 中您的站点证书的后面：  

     ```
           -----BEGIN CERTIFICATE-----
       certificate file contents
       -----END CERTIFICATE-----
       -----BEGIN CERTIFICATE-----
       first intermediate certificate
       -----END CERTIFICATE-----
       -----BEGIN CERTIFICATE-----
       second intermediate certificate
       -----END CERTIFICATE-----
     ```  
`/etc/pki/tls/certs/server.key`  
在实例上创建私有密钥文件。*private key contents*替换为用于创建证书请求或自签名证书的私钥内容。  
**Example 用于为使用 Passenger 的 Ruby 配置 HTTPS 的 .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 # See note below.
         -----END RSA PRIVATE KEY-----
   ```
**注意**  
避免将包含私有密钥的配置文件提交到源控件。在测试完配置并确认其有效后，请在 Amazon S3 中存储私有密钥并修改配置以在部署期间下载该密钥。有关说明，请参阅[在 Amazon S3 中安全地存储私有密钥](https-storingprivatekeys.md)。

1. 创建一个文本文件并将以下 JSON 添加到该文件。将该文件保存在源包的名为 `passenger-standalone.json` 的根目录中。此 JSON 文件将 Passenger 配置为使用 HTTPS。
**重要**  
此 JSON 文件不得包含字节顺序标记 (BOM)。如果此文件包含字节顺序标记，则 Passenger JSON 库将不会正确读取此文件，并且 Passenger 服务将不会启动。  
**Example passenger-standalone.json**  

   ```
   {
     "ssl" : true,
     "ssl_port" : 443,
     "ssl_certificate" : "/etc/pki/tls/certs/server.crt",
     "ssl_certificate_key" : "/etc/pki/tls/certs/server.key"
   }
   ```

在单实例环境中，您还必须修改实例的安全组，以便允许端口 443 上的流量。以下配置文件使用 CloudFormation [函数](ebextensions-functions.md)检索安全组的 ID 并向其添加规则。

**Example .ebextensions/ .config https-instance-single**  

```
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-tcp-passthrough.md)[加密](configuring-https-endtoend.md)。 end-to-end

# 在运行 Tomcat 的 EC2 实例上终止 HTTPS
<a name="https-singleinstance-tomcat"></a>

对于 Tomcat 容器类型，您可使用[配置文件](ebextensions.md)来允许 HTTP Server 在充当 Tomcat 的反向代理时使用 HTTPS。

将以下代码段添加到您的配置文件中，按照提示替换证书和私有密钥资料，并将该文件保存在源包的 `.ebextensions` 目录中。该配置文件执行以下任务：
+ `files` 密钥在实例上创建以下文件：  
`/etc/pki/tls/certs/server.crt`  
在实例上创建证书文件。*certificate file contents*替换为证书的内容。  
YAML 依赖一致的缩进。当替换示例配置文件中的内容时，应匹配缩进级别，并且确保您的文本编辑器使用空格而不是字符来进行缩进。  
`/etc/pki/tls/certs/server.key`  
在实例上创建私有密钥文件。*private key contents*替换为用于创建证书请求或自签名证书的私钥内容。  
`/opt/elasticbeanstalk/hooks/appdeploy/post/99_start_httpd.sh`  
创建部署后挂钩脚本以重新启动 httpd 服务。

**Example .ebextensions/https-instance.config**  

```
files:
  /etc/pki/tls/certs/server.crt:
    mode: "000400"
    owner: root
    group: root
    content: |
      -----BEGIN CERTIFICATE-----
      certificate file contents
      -----END CERTIFICATE-----
      
  /etc/pki/tls/certs/server.key:
    mode: "000400"
    owner: root
    group: root
    content: |
      -----BEGIN RSA PRIVATE KEY-----
      private key contents # See note below.
      -----END RSA PRIVATE KEY-----

  /opt/elasticbeanstalk/hooks/appdeploy/post/99_start_httpd.sh:
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      sudo service httpd restart
```

您还必须将环境的代理服务器配置为在端口 443 上进行侦听。以下 Apache 2.4 配置将在端口 443 上添加一个侦听器。要了解更多信息，请参阅[配置代理服务器](java-tomcat-proxy.md)。

**Example 。 ebextensions/httpd/conf.d/ssl.conf**  

```
Listen 443
<VirtualHost *:443> 
  ServerName server-name
  SSLEngine on 
  SSLCertificateFile "/etc/pki/tls/certs/server.crt" 
  SSLCertificateKeyFile "/etc/pki/tls/certs/server.key" 

  <Proxy *> 
    Require all granted 
  </Proxy> 
  ProxyPass / http://localhost:8080/ retry=0 
  ProxyPassReverse / http://localhost:8080/ 
  ProxyPreserveHost on 

  ErrorLog /var/log/httpd/elasticbeanstalk-ssl-error_log 

</VirtualHost>
```

您的证书供应商可能包含中间证书，可安装此证书以提高与移动客户端的兼容性。使用中间证书颁发机构 (CA) 捆绑配置 Apache，方法是将以下内容添加到您的 SSL 配置文件 (如需了解位置，请参阅[扩展并覆盖默认 Apache 配置 — 亚马逊 Linux AMI () AL1](java-tomcat-proxy.md#java-tomcat-proxy-apache))：
+ 在 `ssl.conf` 文件内容中，指定链文件：

  ```
  SSLCertificateKeyFile "/etc/pki/tls/certs/server.key"
  SSLCertificateChainFile "/etc/pki/tls/certs/gd_bundle.crt"
  SSLCipherSuite        EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
  ```
+ 使用中间证书的内容向 `files` 密钥添加新条目：

  ```
  files:
    /etc/pki/tls/certs/gd_bundle.crt:
      mode: "000400"
      owner: root
      group: root
      content: |
        -----BEGIN CERTIFICATE-----
        First intermediate certificate
        -----END CERTIFICATE-----
        -----BEGIN CERTIFICATE-----
        Second intermediate certificate
        -----END CERTIFICATE-----
  ```

**注意**  
避免将包含私有密钥的配置文件提交到源控件。在测试完配置并确认其有效后，请在 Amazon S3 中存储私有密钥并修改配置以在部署期间下载该密钥。有关说明，请参阅[在 Amazon S3 中安全地存储私有密钥](https-storingprivatekeys.md)。

在单实例环境中，您还必须修改实例的安全组，以便允许端口 443 上的流量。以下配置文件使用 CloudFormation [函数](ebextensions-functions.md)检索安全组的 ID 并向其添加规则。

**Example .ebextensions/ .config https-instance-single**  

```
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-tcp-passthrough.md)[加密](configuring-https-endtoend.md)。 end-to-end

# 在运行 .NET Core on Linux 的 Amazon EC2 实例上终止 HTTPS
<a name="https-singleinstance-dotnet-linux"></a>

对于 .NET Core on Linux 容器类型，您可以使用 `.ebextensions`[配置文件](ebextensions.md)和 nginx 配置文件（用于配置 nginx 服务器以使用 HTTPS）来启用 HTTPS。

将以下代码段添加到您的配置文件中，按照提示替换证书和私有密钥占位符，并将该文件保存在 `.ebextensions` 目录中。该配置文件执行以下任务：
+ `files` 密钥在实例上创建以下文件：  
`/etc/pki/tls/certs/server.crt`  
在实例上创建证书文件。*certificate file contents*替换为证书的内容。  
YAML 依赖一致的缩进。当替换示例配置文件中的内容时，应匹配缩进级别，并且确保您的文本编辑器使用空格而不是字符来进行缩进。
如果您有中间证书，请将其放入 `server.crt` 中您的站点证书的后面：  

  ```
        -----BEGIN CERTIFICATE-----
    certificate file contents
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    first intermediate certificate
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    second intermediate certificate
    -----END CERTIFICATE-----
  ```  
`/etc/pki/tls/certs/server.key`  
在实例上创建私有密钥文件。*private key contents*替换为用于创建证书请求或自签名证书的私钥内容。

**Example .ebextensions/https-instance.config**  

```
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 # See note below.
      -----END RSA PRIVATE KEY-----
```

**注意**  
避免将包含私有密钥的配置文件提交到源控件。在测试完配置并确认其有效后，请在 Amazon S3 中存储私有密钥并修改配置以在部署期间下载该密钥。有关说明，请参阅[在 Amazon S3 中安全地存储私有密钥](https-storingprivatekeys.md)。

将以下内容放置在源代码包的 `.platform/nginx/conf.d/` 目录内扩展名为 `.conf` 的文件中（例如 `.platform/nginx/conf.d/https.conf`）。*app\$1port*替换为应用程序监听的端口号。此示例配置 nginx 服务器使用 SSL 侦听端口 443。有关 .NET Core on Linux 平台上的这些配置文件的更多信息，请参阅[配置代理服务器](dotnet-linux-platform-nginx.md)。

**Example 。 platform/nginx/conf.d/https.conf**  

```
# HTTPS server

server {
    listen       443 ssl;
    server_name  localhost;
    
    ssl_certificate      /etc/pki/tls/certs/server.crt;
    ssl_certificate_key  /etc/pki/tls/certs/server.key;
    
    ssl_session_timeout  5m;
    
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers   on;
    
    location / {
        proxy_pass  http://localhost:app_port;
        proxy_set_header   Connection "";
        proxy_http_version 1.1;
        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto https;
    }
}
```

在单实例环境中，您还必须修改实例的安全组，以便允许端口 443 上的流量。以下配置文件使用 CloudFormation [函数](ebextensions-functions.md)检索安全组的 ID 并向其添加规则。

**Example .ebextensions/ .config https-instance-single**  

```
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-tcp-passthrough.md)[加密](configuring-https-endtoend.md)。 end-to-end

# 在运行.NET 的亚马逊 EC2 实例上终止 HTTPS
<a name="SSLNET.SingleInstance"></a>

以下[配置文件](ebextensions.md)创建并运行用于执行以下任务的 Windows PowerShell 脚本：
+ 检查现有 HTTPS 证书是否已绑定到端口 443。
+ 从 Amazon S3 存储桶获取 [PFX 证书](configuring-https-ssl.md)。
**注意**  
向 `aws-elasticbeanstalk-ec2-role` 添加 `AmazonS3ReadOnlyAccess` 策略，以访问 Amazon S3 存储桶中的 SSL 证书。
+ 从中获取密码 AWS Secrets Manager。
**注意**  
在 `aws-elasticbeanstalk-ec2-role` 中添加一条语句，以允许对包含证书密码的密钥执行 `secretsmanager:GetSecretValue` 操作
+ 安装证书。
+ 将证书绑定到端口 443。
**注意**  
要删除 HTTP 终端节点（端口 80），请在示例的**删除 HTTP 绑定** 部分中包括 `Remove-WebBinding` 命令。

**Example .ebextensions/ .config https-instance-dotnet**  

```
files:
  "C:\\certs\\install-cert.ps1":
    content: |
      import-module webadministration
      ## Settings - replace the following values with your own
      $bucket = "amzn-s3-demo-bucket"  ## S3 bucket name
      $certkey = "example.com.pfx"    ## S3 object key for your PFX certificate
      $secretname = "example_secret"  ## AWS Secrets Manager name for a secret that contains the certificate's password
      ##

      # Set variables
      $certfile = "C:\cert.pfx"
      $pwd = Get-SECSecretValue -SecretId $secretname | select -expand SecretString

      # Clean up existing binding
      if ( Get-WebBinding "Default Web Site" -Port 443 ) {
        Echo "Removing WebBinding"
        Remove-WebBinding -Name "Default Web Site" -BindingInformation *:443:
      }
      if ( Get-Item -path IIS:\SslBindings\0.0.0.0!443 ) {
        Echo "Deregistering WebBinding from IIS"
        Remove-Item -path IIS:\SslBindings\0.0.0.0!443
      }

      # Download certificate from S3
      Read-S3Object -BucketName $bucket -Key $certkey -File $certfile
      
      # Install certificate
      Echo "Installing cert..."
      $securepwd = ConvertTo-SecureString -String $pwd -Force -AsPlainText
      $cert = Import-PfxCertificate -FilePath $certfile cert:\localMachine\my -Password $securepwd
      
      # Create site binding
      Echo "Creating and registering WebBinding"
      New-WebBinding -Name "Default Web Site" -IP "*" -Port 443 -Protocol https
      New-Item -path IIS:\SslBindings\0.0.0.0!443 -value $cert -Force
      
      ## Remove the HTTP binding
      ## (optional) Uncomment the following line to unbind port 80
      # Remove-WebBinding -Name "Default Web Site" -BindingInformation *:80:
      ##
      
      # Update firewall
      netsh advfirewall firewall add rule name="Open port 443" protocol=TCP localport=443 action=allow dir=OUT

commands:
  00_install_ssl:
    command: powershell -NoProfile -ExecutionPolicy Bypass -file C:\\certs\\install-cert.ps1
```

在单实例环境中，您还必须修改实例的安全组，以便允许端口 443 上的流量。以下配置文件使用 CloudFormation [函数](ebextensions-functions.md)检索安全组的 ID 并向其添加规则。

**Example .ebextensions/ .config https-instance-single**  

```
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-tcp-passthrough.md)[加密](configuring-https-endtoend.md)。 end-to-end

# 在负载均衡的 Elastic Beanstalk 环境中配置 end-to-end加密
<a name="configuring-https-endtoend"></a>

终止负载均衡器的安全连接并在后端上使用 HTTP 可能对应用程序已经足够。即使在同一账户下运行， AWS 资源之间的网络流量也不会被不属于连接的实例侦听。

但是，如果您正在开发需要遵守严格外部规定的应用程序，则可能需要保护所有网络连接。您可以使用 Elastic Beanstalk 控制台或[配置文件](ebextensions.md)，将 Elastic Beanstalk 环境的负载均衡器安全地连接到后端实例以满足这些要求。以下过程将重点放在配置文件上。

首先，[在负载均衡器中添加一个安全侦听器](configuring-https-elb.md)（如果尚未添加）。

您还必须配置环境中的实例，以侦听安全端口并终止 HTTPS 连接。此配置根据不同平台而有所变化。有关说明，请参阅[在实例上配置 HTTPS 终止](https-singleinstance.md)：您可以毫无问题地为 EC2 实例使用[自签名证书](configuring-https-ssl.md)。

接下来，配置侦听器在应用程序使用的端口上使用 HTTPS 转发流量。根据您的环境使用的负载均衡器类型，使用以下配置文件之一。

**`.ebextensions/https-reencrypt-clb.config`**

将此配置文件与经典负载均衡器配合使用。除了配置负载均衡器以外，该配置文件还更改默认运行状况检查以使用端口 443 和 HTTPS，以确保负载均衡器可以安全地进行连接。

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

**`.ebextensions/https-reencrypt-alb.config`**

将此配置文件与 Application Load Balancer 配合使用。

```
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`**

将此配置文件与 Network Load Balancer 配合使用。

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

`DefaultProcess` 选项以此方式命名是因为 Application Load Balancer，它可能在同一端口上具有非默认侦听器，以用于侦听到特定路径的流量（如需详细信息，请参阅 [应用程序负载均衡器](environments-cfg-alb.md)）。对于 Network Load Balancer，该选项为该侦听器指定唯一的目标进程。

在此示例中，我们将进程命名为 `https`，因为它侦听安全 (HTTPS) 流量。由于 Network Load Balancer 只能使用 TCP，因此该侦听器使用 TCP 协议将流量发送到指定端口上的进程。由于 HTTP 和 HTTPS 网络流量是在 TCP 上实施的，因此，可以这样做。

**注意**  
EB CLI 和 Elastic Beanstalk 控制台会对前面的选项应用建议的值。如果您需要使用配置文件来配置相同的项，则必须删除这些设置。有关更多信息，请参阅 [建议值](command-options.md#configuration-options-recommendedvalues)。

在下一个任务中，您需要将负载均衡器的安全组修改为允许流量。根据您启动环境所在的 [Amazon Virtual Private Cloud](https://docs.aws.amazon.com/vpc/latest/userguide/) (Amazon VPC)（默认 VPC 或自定义 VPC），负载均衡器的安全组将有所不同。在默认 VPC 中，Elastic Load Balancing 提供可供所有负载均衡器使用的默认安全组。在您创建的 Amazon VPC 中，Elastic Beanstalk 会创建一个安全组供负载均衡器使用。

为了同时支持两种方案，您可创建一个安全组并告知 Elastic Beanstalk 使用该安全组。以下配置文件创建安全组并将其连接到负载均衡器。

**`.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
```

用默认或自定义 VPC ID 替换突出显示的文本。上述示例包括通过端口 80 的入口和出口，以允许 HTTP 连接。如果您只想要允许安全连接，则可删除这些属性。

最后，添加允许在负载均衡器的安全组和实例的安全组之间通过端口 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 安全地连接至后端实例。负载均衡器不关心实例证书为自签名还有由可信赖的证书颁发机构颁发，并将接受向它提交的任何证书。

您可为负载均衡器添加策略，告知它只可信任某个特定证书，从而更改此行为。以下配置文件创建两个策略。一个策略指定公有证书，另一个策略则告知负载均衡器只可为实例端口 443 的连接信任该证书。

**`.ebextensions/https-backendauth.config`**

```
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-----
```

将突出显示的文本替换为您的 EC2 实例的公共证书的内容。

# 为 TCP 传递配置环境的负载均衡器
<a name="https-tcp-passthrough"></a>

如果您不希望 AWS Elastic Beanstalk 环境中的负载均衡器解密 HTTPS 流量，则可以将安全侦听器配置为按原样将请求中继到后端实例。

**重要**  
将负载均衡器配置为中继 HTTPS 流量而不解密存在一个缺点。负载均衡器无法看到加密的请求，因此无法优化路由或报告响应指标。

首先[将您的环境 EC2 实例配置为终止 HTTPS](https-singleinstance.md)。在为组合添加负载均衡器之前，在单一实例环境中测试配置，以确保一切正常运行。

将[配置文件](ebextensions.md)添加到您的项目，以便在端口 443 上配置监听器，该端口将 TCP 包原样传递至后端实例上的端口 443：

**`.ebextensions/https-lb-passthrough.config`**

```
option_settings:
  aws:elb:listener:443:
    ListenerProtocol: TCP
    InstancePort: 443
    InstanceProtocol: TCP
```

在默认的 [Amazon Virtual Private Cloud](https://docs.aws.amazon.com/vpc/latest/userguide/) (Amazon VPC) 中，您还需要向实例的安全组添加规则，以允许端口 443 上来自负载均衡器的入站流量：

**`.ebextensions/https-instance-securitygroup.config`**

```
Resources:
  443inboundfromloadbalancer:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]}
      IpProtocol: tcp
      ToPort: 443
      FromPort: 443
      SourceSecurityGroupName: { "Fn::GetAtt": ["AWSEBLoadBalancer", "SourceSecurityGroup.GroupName"] }
```

在自定义 VPC 中，Elastic Beanstalk 会为您更新安全组配置。

# 配置 HTTP 到 HTTPS 重定向
<a name="configuring-https-httpredirect"></a>

本主题介绍如何在最终用户仍在启动应用程序时处理到该应用程序的 HTTP 流量。为此，您需要配置 *HTTP to HTTPS redirection (HTTP 到 HTTPS 重定向)*，有时也称为*强制 HTTPS*。

要配置重定向，您首先将环境配置为处理 HTTPS 流量。然后，您可以将 HTTP 流量重定向到 HTTPS。下面的小节将讨论这两个步骤。

## 配置您的环境以处理 HTTPS 流量
<a name="configuring-https-httpredirect.https"></a>

根据环境的负载均衡配置，执行以下操作之一：
+ **负载均衡环境** – [配置负载均衡器以终止 HTTPS](configuring-https-elb.md)。
+ **单实例环境** – [配置您的应用程序以终止实例中的 HTTPS 连接](https-singleinstance.md)。此配置取决于您环境的平台。

## 将 HTTP 流量重定向到 HTTPS
<a name="configuring-https-httpredirect.redirect"></a>

要将应用程序的 HTTP 流量重定向到 HTTPS，您可以配置环境实例上的 Web 服务器，也可以配置环境的应用程序负载均衡器。

**配置实例 Web 服务器**  
此方法适用于任何 Web 服务器环境。在您的 Amazon EC2 实例上配置网络服务器，使其以 HTTP 重定向响应状态响应 HTTP 流量。

此配置取决于您环境的平台。在上的[https://github.com/awsdocs/elastic-beanstalk-samples/tree/master/configuration-files/aws-provided/security-configuration/https-redirect](https://github.com/awsdocs/elastic-beanstalk-samples/tree/master/configuration-files/aws-provided/security-configuration/https-redirect)集合中找到适用于您平台的文件夹 GitHub，然后使用该文件夹中的示例配置文件。

如果您的环境使用 [Elastic Load Balancing 运行状况检查](using-features.healthstatus.md#using-features.healthstatus.understanding)，负载均衡器需要运行状况良好的实例用 HTTP 200 (OK) 响应来响应 HTTP 运行状况检查消息。因此，您的 Web 服务器不应将这些消息重定向到 HTTPS。[https://github.com/awsdocs/elastic-beanstalk-samples/tree/master/configuration-files/aws-provided/security-configuration/https-redirect](https://github.com/awsdocs/elastic-beanstalk-samples/tree/master/configuration-files/aws-provided/security-configuration/https-redirect) 中的示例配置文件可正确处理这一需求。

**配置负载均衡器**  
如果您拥有使用[应用程序负载均衡器](environments-cfg-alb.md)的负载均衡环境，则此方法有效。当 HTTP 流量进入时，应用程序负载均衡器可以发送重定向响应。在这种情况下，不需要在您环境的实例上配置重定向。

我们有两个示例配置文件 GitHub ，它们显示了如何配置 Application Load Balancer 以进行重定向。
+ [https://github.com/awsdocs/elastic-beanstalk-samples/blob/master/configuration-files/aws-provided/resource-configuration/alb-http-to-https-redirection-full.config](https://github.com/awsdocs/elastic-beanstalk-samples/blob/master/configuration-files/aws-provided/resource-configuration/alb-http-to-https-redirection-full.config) 配置文件在端口 443 上创建 HTTPS 侦听器，并修改默认端口 80 侦听器以将传入的 HTTP 流量重定向到 HTTPS。
+ [https://github.com/awsdocs/elastic-beanstalk-samples/blob/master/configuration-files/aws-provided/resource-configuration/alb-http-to-https-redirection.config](https://github.com/awsdocs/elastic-beanstalk-samples/blob/master/configuration-files/aws-provided/resource-configuration/alb-http-to-https-redirection.config) 配置文件需要定义 443 侦听器。要定义它，您可以使用标准 Elastic Beanstalk 配置命名空间或 Elastic Beanstalk 控制台。然后，它负责修改端口 80 侦听器以便执行重定向。