

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

# 教程： SSL/TLS 在亚马逊 Linux 上配置 AMI
<a name="SSL-on-amazon-linux-ami"></a>

**注意**  
 不再支持亚马逊 Linux 1（AL1前身为亚马逊 Linux AMI）。本指南仅供参考。

安全套接字 Layer/Transport 层安全（SSL/TLS) creates an encrypted channel between a web server and web client that protects data in transit from being eavesdropped on. This tutorial explains how to add support manually for SSL/TLS在装有 Amazon Linux AMI 和 Apache Web 服务器的 EC2 实例上。本教程假定您未使用负载均衡器。如果您正在使用 Elastic Load Balancing，则可以选择使用来自 [Amazon Certificate Manager](https://www.amazonaws.cn/certificate-manager/) 的证书在负载均衡器上配置 SSL 卸载。

由于历史原因，Web 加密通常简称为 SSL。虽然 Web 浏览器仍支持 SSL，但使用其下一代协议 TLS 更不易受攻击。默认情况下，Amazon Linux AMI 将禁用所有版本 SSL 的服务器端支持。[安全标准机构](https://www.ssl.com/article/deprecating-early-tls/)认为 TLS 1.0 不安全。TLS 1.0 和 TLS 1.1 已于 2021 年 3 月正式[弃用](https://datatracker.ietf.org/doc/rfc8996/)。本教程仅包含有关启用 TLS 1.2 的指导。TLS 1.3 已于 2018 年完成， AL2 只要支持和启用底层 TLS 库（本教程中的 OpenSSL），即可使用。[客户端必须在 2023 年 6 月 28 日之前支持 TLS 1.2 或更高版本](https://www.amazonaws.cn/blogs/security/tls-1-2-required-for-aws-endpoints/)。有关更新的加密标准的更多信息，请参阅 [RFC 7568](https://tools.ietf.org/html/rfc7568) 和 [RFC 8446](https://tools.ietf.org/html/rfc8446)。

在本教程中，将现代 Web 加密简称为 TLS。

**重要**  
这些过程适用于 Amazon Linux AMI。如果您尝试具有其他分配的实例上设置 LAMP Web 服务器，则本教程中的一些过程可能不适合您。有关信息 AL2，请参阅[ SSL/TLS 开启配置 AL2](https://docs.amazonaws.cn/linux/al2/ug/SSL-on-amazon-linux-2.html)。对于 Ubuntu，请参阅以下社区文档：[Open SSL on Ubuntu](https://help.ubuntu.com/community/OpenSSL)。有关 Red Hat Enterprise Linux 的信息，请参阅以下：[设置 Apache HTTP Web 服务器](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/deploying_different_types_of_servers/setting-apache-http-server_deploying-different-types-of-servers)。有关其他发布版本，请参阅特定于该版本的文档。

**注意**  
或者，您可以将 Amazon Certificate Manager (ACM) 用于 Amazon Nitro 安全区，这是一种安全区应用程序，允许您在带有 Nitro Enclaves 的 Amazon 实例上运行的 Web 应用程序和服务器上使用公有和私有 SSL/TLS 证书。 EC2 AmazonNitro Enclaves 是 Amazon 的一项 EC2 功能，它允许创建隔离的计算环境，以保护和安全地处理高度敏感的数据，例如 SSL/TLS 证书和私钥。  
ACM for Nitro Enclaves 可与在 Amazon Linux 实例上**运行**的 ng EC2 inx 配合使用，以创建私钥、分发证书和私钥以及管理证书续订。  
要使用适用于 Nitro Enclaves 的 ACM，必须使用启用了 Enclave 的 Linux 实例。  
有关更多信息，请参阅[什么是Amazon硝基飞地](https://docs.amazonaws.cn/enclaves/latest/user/nitro-enclave.html)？ 以及[Amazon Certificate Manager《Nitro Enclaves](https://docs.amazonaws.cn/enclaves/latest/user/nitro-enclave-refapp.html) 用户指南》中的 *AmazonNitro* Enclaves。

**Topics**
+ [

## 前提条件
](#ssl-prereq-alami)
+ [

## 步骤 1：在服务器上启用 TLS
](#ssl-enable-alami)
+ [

## 步骤 2：获取 CA 签名的证书
](#ssl-certificate-alami)
+ [

## 步骤 3：测试和强化安全配置
](#ssl-test-alami)
+ [

## 故障排除
](#troubleshooting-alami)

## 前提条件
<a name="ssl-prereq-alami"></a>

在开始本教程之前，请完成以下步骤：
+ 使用 Amazon Linux AMI 启动 EBS 支持的实例。有关更多信息，请参阅 *Amazon EC2 用户指南*中的[启动实例](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/ec2-launch-instance-wizard.html)。
+ 配置安全组以允许您的实例接受以下 TCP 端口上的连接：
  + SSH (端口 22)
  + HTTP (端口 80)
  + HTTPS (端口 443)

  有关更多信息，请参阅 *Amazon EC2 用户指南*中的[安全组规则](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/security-group-rules.html)。
+ 安装 Apache Web 服务器。有关 step-by-step说明，请参阅[教程：在亚马逊 Linux 上安装 LAMP Web 服务器](install-LAMP.md)。仅需要 http24 包及其依赖项；可以忽略涉及 PHP 和 MySQL 的说明。
+ 为了识别和验证网站，TLS 公有密钥基础设施 (PKI) 依赖于域名系统 (DNS)。要使用您的 EC2实例托管公共网站，您需要为 Web 服务器注册域名或将现有域名转移到您的 Amazon EC2 主机。可通过很多第三方域注册和 DNS 托管服务来执行此操作，也可以使用 [Amazon Route 53](https://docs.amazonaws.cn/Route53/latest/DeveloperGuide/Welcome.html) 执行此操作。

## 步骤 1：在服务器上启用 TLS
<a name="ssl-enable-alami"></a>

**选项：使用 Automation 完成本教程**  
要使用Amazon Systems Manager而不是以下任务来完成本教程，请运行[自动化文档](https://console.amazonaws.cn/systems-manager/documents/AWSDocs-Configure-SSL-TLS-AL/)。

该过程指导您完成在 Amazon Linux 上使用自签名数字证书设置 TLS 的过程。

**注意**  
自签名证书对于测试是可接受的，但对于生产不是。如果您将自签名证书公开到 Internet，则您网站的访客将收到安全警告。

**在服务器上启用 TLS**

1. [连接到您的实例](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/connect-to-linux-instance.html)并确认 Apache 正在运行。

   ```
   [ec2-user ~]$ sudo service httpd status
   ```

   如有必要，启动 Apache。

   ```
   [ec2-user ~]$ sudo service httpd start
   ```

1. 为确保您的所有软件包都处于最新状态，请对您的实例执行快速软件更新。此过程可能需要几分钟的时间，但必须确保您拥有最新的安全更新和缺陷修复。
**注意**  
`-y` 选项安装更新时不提示确认。如果您希望在安装前检查更新，则可以忽略该选项。

   ```
   [ec2-user ~]$ sudo yum update -y
   ```

1. 现在，您的实例是最新的，请安装 Apache 模块 `mod_ssl` 以添加 TLS 支持：

   ```
   [ec2-user ~]$ sudo yum install -y mod_ssl
   ```

   您的实例现在具有以下文件，可使用这些文件配置安全服务器并创建证书以进行测试：  
`/etc/httpd/conf.d/ssl.conf`  
mod\$1ssl 的配置文件。它包含一些“指令”以指示 Apache 在何处查找以下信息：加密密钥和证书、要允许的 TLS 协议版本以及要接受的加密密码。  
`/etc/pki/tls/private/localhost.key`  
为您的 Amazon 主机自动生成的 2048 位 RSA 私钥。 EC2在安装期间，OpenSSL 已使用此密钥生成自签名主机证书，您也可使用此密钥生成证书签名请求 (CSR) 以提交给证书颁发机构 (CA)。  
`/etc/pki/tls/certs/localhost.crt`  
针对服务器主机的自动生成的自签名 X.509 证书。要测试是否正确设置 Apache 以使用 TLS，该证书是非常有用的。

   `.key` 和 `.crt` 文件均为 PEM 格式，其中包含采用 Base64 编码的 ASCII 字符，并用“BEGIN”和“END”行框起来，如下面的简短证书示例所示：

   ```
   -----BEGIN CERTIFICATE-----
   MIIEazCCA1OgAwIBAgICWxQwDQYJKoZIhvcNAQELBQAwgbExCzAJBgNVBAYTAi0t
   MRIwEAYDVQQIDAlTb21lU3RhdGUxETAPBgNVBAcMCFNvbWVDaXR5MRkwFwYDVQQK
   DBBTb21lT3JnYW5pemF0aW9uMR8wHQYDVQQLDBZTb21lT3JnYW5pemF0aW9uYWxV
   bml0MRkwFwYDVQQDDBBpcC0xNzItMzEtMjAtMjM2MSQwIgYJKoZIhvcNAQkBFhVy
   ...
   z5rRUE/XzxRLBZOoWZpNWTXJkQ3uFYH6s/sBwtHpKKZMzOvDedREjNKAvk4ws6F0
   WanXWehT6FiSZvB4sTEXXJN2jdw8g+sHGnZ8zCOsclknYhHrCVD2vnBlZJKSZvak
   3ZazhBxtQSukFMOnWPP2a0DMMFGYUHOd0BQE8sBJxg==
   -----END CERTIFICATE-----
   ```

   文件名和扩展名只是为了提供便利，对功能没有影响；只要 `cert.crt` 文件中的相关指令使用相同的名称，您可以将证书命名为 `cert.pem`、`ssl.conf` 或任何其他文件名。
**注意**  
在使用您自己的自定义文件替换默认 TLS 文件时，请确保它们采用 PEM 格式。

1. 重启 Apache。

   ```
   [ec2-user ~]$ sudo service httpd restart
   ```

1. 现在，您的 Apache Web 服务器应通过端口 443 支持 HTTPS (安全 HTTP)。通过在带有前缀的浏览器 URL 栏中键入 EC2实例的 IP 地址或完全限定域名来对其进行测试**https://**。由于您正在使用自签名的不可信主机证书连接到站点，因此您的浏览器可能会显示一系列安全警告。

   忽视这些警告并继续连接站点。如果默认 Apache 测试页面打开，这意味着您已成功在服务器上配置 TLS。在浏览器和服务器之间传输的所有数据现在都被安全地加密了。

   为了防止站点访问者遇到警告屏幕，您需要获取一个证书，该证书不仅用于加密，而且还用于公开验证您的站点所有者身份。

## 步骤 2：获取 CA 签名的证书
<a name="ssl-certificate-alami"></a>

您可以使用以下过程获取 CA 签名证书：
+ 从私有密钥生成证书签名请求 (CSR)
+ 将 CSR 提交给证书颁发机构 (CA)
+ 获取签名的主机证书
+ 配置 Apache 以使用证书

从加密角度看，自签名 TLS X.509 主机证书与 CA 签名证书完全相同。二者之间的区别在于社交层面，而非数学层面；CA 承诺，在向申请者颁发证书之前，至少验证域的所有权。每个 Web 浏览器都包含浏览器供应商 CAs 信任的列表。X.509 证书主要包含一个与您的私有服务器密钥对应的公有密钥和一个以加密方式与该公有密钥关联的 CA 的签名。当浏览器通过 HTTPS 连接到 Web 服务器时，服务器会提供一份证书，供浏览器根据其可信列表进行核对 CAs。如果签署人位于列表上，或可通过由其他可信签署人组成的一系列信任访问，则浏览器将与服务器协商一个快速加密数据通道并加载页面。

由于验证请求需要投入人力，证书通常会产生费用，因此应货比三家。一些公司免费 CAs 提供基本级别的证书。其中最引人注目的是 CAs L [et's Encrypt](https://letsencrypt.org/) 项目，该项目还支持证书创建和续订过程的自动化。有关使用 Let's Encrypt 证书的更多信息，请参阅[获取 Certbot](https://eff-certbot.readthedocs.io/en/stable/install.html)。

如果您打算提供商业级服务，[Amazon Certificate Manager](https://docs.amazonaws.cn/acm/latest/userguide/acm-overview.html) 是一个不错的选择。

主机证书的基础是密钥。自 2017 年起，[政府](http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r4.pdf)和[行业](https://cabforum.org/wp-content/uploads/CA-Browser-Forum-BR-1.4.2.pdf)群体建议对 RSA 密钥使用 2048 位的最小密钥 (模数) 大小，旨在保护文档直到 2030 年。OpenSSL 在 Amazon Linux 中生成的默认系数大小为 2048 位，意味着现有的自动生成的密钥适用于 CA 签名的证书。下面介绍了适合需要自定义密钥的人员的替代过程，例如，具有较大系数或使用不同加密方法的过程。

除非您拥有注册并托管的 DNS 域，否则，有关获取 CA 签名主机证书的这些说明不适用。

**获取 CA 签名的证书**

1.  [连接到](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/connect-to-linux-instance.html)您的实例并导航到etc/pki/tls/private//。这是存储适用于 TLS 的服务器私有密钥的目录。如果您希望使用现有主机密钥来生成 CSR，请跳至步骤 3。

1. (可选) 生成新的私有密钥。下面是一些密钥配置示例。任何生成的密钥都将用于 Web 服务器，但它们实施安全的方式和程度有所不同。
   + **示例 1：**创建默认 RSA 主机密钥。生成的文件 **custom.key** 是一个 2048 位 RSA 私有密钥。

     ```
     [ec2-user ~]$ sudo openssl genrsa -out custom.key
     ```
   + **示例 2：**创建具有更大模数的更严格的 RSA 密钥。生成的文件 **custom.key** 是一个 4096 位 RSA 私有密钥。

     ```
     [ec2-user ~]$ sudo openssl genrsa -out custom.key 4096
     ```
   + **示例 3：**创建具有密码保护的 4096 位加密的 RSA 密钥。生成的文件 **custom.key** 是一个已使用 AES-128 密码加密的 4096 位 RSA 私有密钥。
**重要**  
对密钥进行加密可增强安全性，但由于加密的密钥需要密码，因此依赖于加密密钥的服务无法自动启动。每当您使用此密钥时，都必须通过 SSH 连接提供密码（在上一示例中为“abcde12345”）。

     ```
     [ec2-user ~]$ sudo openssl genrsa -aes128 -passout pass:abcde12345 -out custom.key 4096
     ```
   + **示例 4：**使用非 RSA 密码创建密钥。RSA 加密可能相对较慢，因为其公有密钥的大小基于两个大素数的乘积。不过，可以为 TLS 创建使用非 RSA 密码的密钥。在交付同等级别的安全性时，基于椭圆曲线的数学运算的密钥更小，计算起来更快。

     ```
     [ec2-user ~]$ sudo openssl ecparam -name prime256v1 -out custom.key -genkey
     ```

     结果为一个使用 prime256v1（OpenSSL 支持的“命名曲线”）的 256 位椭圆曲线私有密钥。[根据 NIST](http://csrc.nist.gov/publications/nistpubs/800-57/sp800-57_part1_rev3_general.pdf)，其加密强度略高于 2048 位 RSA 密钥。
**注意**  
并非所有密钥都 CAs 提供与 RSA elliptic-curve-based 密钥相同的支持级别。

   确保新的私钥具有高度限制的所有权和权限（owner=root，group=root，仅适用于所有者）。 read/write 命令如下：

   ```
   [ec2-user ~]$ sudo chown root.root custom.key
   [ec2-user ~]$ sudo chmod 600 custom.key
   [ec2-user ~]$ ls -al custom.key
   ```

   上述命令应生成以下结果：

   ```
   -rw------- root root custom.key
   ```

    在创建并配置满意的密钥后，可以创建 CSR。

1. 使用您的首选密钥创建 CSR；下面的示例将使用 **custom.key**：

   ```
   [ec2-user ~]$ sudo openssl req -new -key custom.key -out csr.pem
   ```

   OpenSSL 将打开一个对话框，并提示您输入下表中显示的信息。对于基本的经域验证的主机证书来说，除 **Common Name** 以外的所有字段都是可选字段。    
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/linux/al1/ug/SSL-on-amazon-linux-ami.html)

   最后，OpenSSL 将提示您输入可选的质询密码。此密码仅适用于 CSR 和您与 CA 之间的事务，因此请遵循 CA 提供的有关此密码以及其他可选字段、可选公司名的建议。CSR 质询密码不会影响服务器操作。

   生成的文件 **csr.pem** 包含您的公有密钥、您的公有密钥的数字签名以及您输入的元数据。

1. 将 CSR 提交给 CA。这通常包括在文本编辑器中打开 CSR 文件并将内容复制到 Web 表格中。此时，可能会要求您提供一个或多个主题备用名称 (SANs) 以放在证书上。如果 **www.example.com** 是公用名，则 **example.com** 将是一个很好的 SAN，反之亦然。您网站的访客如果键入这两个名称的任何一个，便可看到一个没有错误的连接。如果您的 CA Web 表单允许，请在列表中包含常用名 SANs。有些是自动 CAs 包含的。

   在您的请求获得批准后，您将收到一个由 CA 签署的新主机证书。此外，系统可能会指示您下载*中间证书*文件，该文件包含完成 CA 的信任链所需的其他证书。
**注意**  
您的 CA 可能会针对各种不同用途，发送多种格式的文件。对于本教程，您应该只使用 PEM 格式的证书文件，此格式通常会 (但不总会) 标有 `.pem` 或 `.crt` 扩展名。如果您不确定要使用哪个文件，请用文本编辑器打开这些文件，并查找包含一个或多个具有以下开头的块的文件：  

   ```
   - - - - -BEGIN CERTIFICATE - - - - - 
   ```
该文件还应具有以下结尾：  

   ```
   - - - -END CERTIFICATE - - - - -
   ```
您还可以如下所示在命令行上测试文件：  

   ```
   [ec2-user certs]$ openssl x509 -in certificate.crt -text
   ```
验证这些行是否显示在文件中。请勿使用结尾为 `.p7b`、`.p7c` 或类似文件扩展名的文件。

1. 将新的 CA 签名证书和任何中间证书放在 `/etc/pki/tls/certs` 目录中。
**注意**  
有多种方法可以将自定义密钥上传到您的 EC2 实例，但最直接和最有用的方法是在本地计算机和实例上打开文本编辑器（例如 vi、nano 或记事本），然后在它们之间复制并粘贴文件内容。在 EC2实例上执行这些操作时，你需要 root [sudo] 权限。这样，一旦有任何权限或路径问题，您可以立即看到。但请小心操作，不要在复制内容时添加任何多余的行或以任何方式更改内容。

   在`/etc/pki/tls/certs`目录内部，使用以下命令验证文件所有权、组和权限设置是否符合严格限制的 Amazon Linux 默认设置（owner=root，group=root，仅适用于所有者）。 read/write 

   ```
   [ec2-user certs]$ sudo chown root.root custom.crt
   [ec2-user certs]$ sudo chmod 600 custom.crt
   [ec2-user certs]$ ls -al custom.crt
   ```

   上述命令应生成以下结果：

   ```
   -rw------- root root custom.crt
   ```

   中间证书文件的权限并不严格 (所有者=根、组=根、所有者可以写入、组可以读取、任何人均可读取)。命令如下：

   ```
   [ec2-user certs]$ sudo chown root.root intermediate.crt
   [ec2-user certs]$ sudo chmod 644 intermediate.crt
   [ec2-user certs]$ ls -al intermediate.crt
   ```

   上述命令应生成以下结果：

   ```
   -rw-r--r-- root root intermediate.crt
   ```

1. 如果您使用自定义密钥创建您的 CSR 和由此生成的主机证书，请从 `/etc/pki/tls/private/` 目录中删除或重命名旧密钥，然后在该目录中安装新密钥。
**注意**  
有多种方法可以将自定义密钥上传到您的 EC2 实例，但最直接和最有用的方法是在本地计算机和实例上打开文本编辑器（vi、nano、记事本等），然后在它们之间复制并粘贴文件内容。在 EC2 实例上执行这些操作时，你需要 root [sudo] 权限。这样，一旦有任何权限或路径问题，您可以立即看到。但请小心操作，不要在复制内容时添加任何多余的行或以任何方式更改内容。

   在`/etc/pki/tls/private`目录内部，检查文件所有权、群组和权限设置是否符合严格限制的 Amazon Linux 默认设置（owner=root、group=root，仅适用于所有者）。 read/write 命令如下：

   ```
   [ec2-user private]$ sudo chown root.root custom.key
   [ec2-user private]$ sudo chmod 600 custom.key
   [ec2-user private]$ ls -al custom.key
   ```

   上述命令应生成以下结果：

   ```
   -rw------- root root custom.key
   ```

1. 编辑 `/etc/httpd/conf.d/ssl.conf` 以反映您的新证书和密钥文件。

   1. 在 Apache 的 `SSLCertificateFile` 指令中提供 CA 签名主机证书的路径和文件名：

      ```
      SSLCertificateFile /etc/pki/tls/certs/custom.crt
      ```

   1. 如果您收到一个中间证书文件（此示例中为 `intermediate.crt`），请使用 Apache 的 `SSLCACertificateFile` 指令提供其路径和文件名：

      ```
      SSLCACertificateFile /etc/pki/tls/certs/intermediate.crt
      ```
**注意**  
有些证书将主机证书和中间证书 CAs 合并到一个文件中，因此没有必要使用此指令。请查询您的 CA 提供的说明。

   1. 在 Apache 的 `SSLCertificateKeyFile` 指令中提供私有密钥的路径和文件名：

      ```
      SSLCertificateKeyFile /etc/pki/tls/private/custom.key
      ```

1. 保存 `/etc/httpd/conf.d/ssl.conf` 并重启 Apache。

   ```
   [ec2-user ~]$ sudo service httpd restart
   ```

1. 通过在浏览器 URL 栏中输入带有 `https://` 前缀的域名来测试您的服务器。您的浏览器应通过 HTTPS 加载测试页面而不会产生错误。

## 步骤 3：测试和强化安全配置
<a name="ssl-test-alami"></a>

在 TLS 可操作且公开发布后，应测试其实际安全性。使用在线服务（例如 [Qualys SSL Labs](https://www.ssllabs.com/ssltest/analyze.html)，该服务可对您的安全设置执行免费的全面分析）可轻松执行此操作。根据结果，您可以决定通过控制接受的协议、首选的密码和排除的密码来强化默认安全配置。有关更多信息，请参阅 [Qualys 如何用公式表示其分数](https://github.com/ssllabs/research/wiki/SSL-Server-Rating-Guide)。

**重要**  
实际测试对服务器的安全性非常重要。少量配置错误可能导致严重的安全漏洞和数据丢失。由于建议的安全实践会不断变化以响应调查和新兴威胁，因此定期安全审核对于良好的服务器管理来说是必不可少的。

在 [Qualys SSL Labs](https://www.ssllabs.com/ssltest/analyze.html) 站点上，用 **www.example.com** 格式键入服务器的完全限定域名。约两分钟后，您将收到您站点的评级 (从 A 到 F) 和结果的详细信息。虽然概述信息显示配置基本正确，但详细报告标记了几个潜在的问题。例如：

✗ **某些较旧的浏览器支持使用该 RC4 密码**。密码是加密算法的数学核心。 RC4[是一种用于加密 TLS 数据流的快速密码，众所周知，它有几个严重的弱点。](http://www.imperva.com/docs/hii_attacking_ssl_when_using_rc4.pdf)除非您有充分理由支持旧版浏览器，否则，应禁用该密码。

✗ **支持旧 TLS 版本。**该配置支持 TLS 1.0（已弃用）和 TLS 1.1（即将弃用）。从 2018 年开始，仅建议使用 TLS 1.2。

**纠正 TLS 配置**

1. 在文本编辑器中打开 `/etc/httpd/conf.d/ssl.conf` 配置文件，并在以下每个行的开头键入“\$1”来注释掉这些行：

   ```
   #SSLProtocol all -SSLv3
   #SSLProxyProtocol all -SSLv3
   ```

1. 添加以下指令：

   ```
   SSLProtocol -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 +TLSv1.2
   SSLProxyProtocol -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 +TLSv1.2
   ```

   这些指令显式禁用 SSL 版本 2 和 3，以及 TLS 版本 1.0 和 1.1。现在，服务器拒绝接受与使用 TLS 1.2 以外的任何协议的客户端之间的加密连接。指令中冗长的文字可更清楚地告知人类读者服务器的作用。
**注意**  
以此方式禁用 TLS 1.0 和 1.1 版可阻止一小部分过时的 Web 浏览器访问您的网站。

**修改允许的密码列表**

1. 打开配置文件 `/etc/httpd/conf.d/ssl.conf`，找到包含用于配置 **SSLCipherSuite** 和 **SSLProxyCipherSuite** 的已注释掉的示例的部分。

   ```
   #SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
   #SSLProxyCipherSuite HIGH:MEDIUM:!aNULL:!MD5
   ```

   保留它们不变，并在它们下面添加以下指令：
**注意**  
此处为方便阅读将指令显示为几行，但这两个指令必须各在一行上且密码名称之间不能有空格。

   ```
   SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:
   ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:
   ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:AES:!aNULL:!eNULL:!EXPORT:!DES:
   !RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
   
   SSLProxyCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:
   ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:
   ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:AES:!aNULL:!eNULL:!EXPORT:!DES:
   !RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
   ```

   这些密码是 OpenSSL 中更长的受支持密码列表的子集。根据以下标准选择这些密码并对其进行排序：
   + 对向前保密性的支持
   + 强度
   + Speed
   + 具体密码位于密码系列之前
   + 允许的密码位于拒绝的密码之前

   高级密码的名称中具有 *ECDHE*（表示 *Elliptic Curve Diffie-Hellman Ephemeral*）；*ephemeral* 表示向前保密性。而且， RC4 现在已接近尾声的禁用密码之一。

   建议您使用密码的明确列表，而不依赖于内容不可见的默认值或简短指令。此处显示的密码列表只是很多可能的列表之一；例如，您可能希望优化列表以加快速度而不是向前保密性。

   如果您预计需要支持较旧的客户端，则可以允许使用 DES CBC3--SHA 密码套件。

   对 OpenSSL 的每次更新将引入新密码并弃用旧密码。保持您的 EC2 Amazon Linux 实例处于最新状态，注意来自 [OpenSSL](https://www.openssl.org/) 的安全公告，并警惕技术媒体上有关新安全漏洞的报道。

1. 通过删除“\$1”取消对以下行的注释：

   ```
   #SSLHonorCipherOrder on
   ```

   该命令强制服务器优先选择高级密码，包括 (在此示例中) 支持向前保密性的密码。启用此指令后，服务器会在回滚到允许的安全性较低的密码之前尝试建立高度安全的连接。

1. 重启 Apache。如果你在 [Qualys SSL Labs](https://www.ssllabs.com/ssltest/analyze.html) 上再次测试该域名，你应该会看到 RC4 漏洞已经消失。

## 故障排除
<a name="troubleshooting-alami"></a>
+ **除非我输入密码，否则我的 Apache Web 服务器不会启动**

  如果您安装了受密码保护的加密的私有服务器密钥，这是预期行为。

  您可以从密钥中删除加密和密码要求。假设您在默认目录`custom.key`中有一个名为的私有加密 RSA 密钥，并且其密码是**abcde12345**，则在您的 EC2 实例上运行以下命令以生成该密钥的未加密版本。

  ```
  [ec2-user ~]$ cd /etc/pki/tls/private/
  [ec2-user private]$ sudo cp custom.key custom.key.bak
  [ec2-user private]$ sudo openssl rsa -in custom.key -passin pass:abcde12345 -out custom.key.nocrypt 
  [ec2-user private]$ sudo mv custom.key.nocrypt custom.key
  [ec2-user private]$ sudo chown root.root custom.key
  [ec2-user private]$ sudo chmod 600 custom.key
  [ec2-user private]$ sudo service httpd restart
  ```

  Apache 现在启动时应该不会提示您提供密码。