

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 教學課程：在 AL2 上設定 SSL/TLS
<a name="SSL-on-amazon-linux-2"></a>

Secure Sockets Layer/Transport Layer Security (SSL/TLS) 會在 Web 伺服器與 Web 用戶端之間建立加密通路，保護傳輸中的資料以防遭到竊聽。本教學課程說明如何在具有 AL2 和 Apache Web 伺服器的 EC2 執行個體上手動新增 SSL/TLS 支援。本教學假設您未使用負載平衡器。如果您正在使用 Elastic Load Balancing，您可以選擇使用來自 [AWS Certificate Manager](https://aws.amazon.com/certificate-manager/) 的憑證設定負載平衡器上的 SSL 卸載。

基於歷史因素，Web 加密通常僅簡單以 SSL 指稱。雖然 Web 瀏覽器仍然支援 SSL，但其後來的通訊協定 TLS 較不易受攻擊。AL2 預設會停用所有 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 年完成，只要基礎 TLS 程式庫 （本教學課程中的 OpenSSL) 受到支援並啟用，即可在 AL2 中使用。[用戶端必須在 2023 年 6 月 28 日之前支援 TLS 1.2 或更新版本](https://aws.amazon.com/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。

**重要**  
這些程序旨在與 AL2 搭配使用。我們也假設您使用的是全新 Amazon EC2 執行個體。如果您嘗試設定執行不同分佈的 EC2 執行個體，或執行舊版 AL2 的執行個體，本教學中的某些程序可能無法運作。若為 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)。若是其他發行版，請參閱其特定文件。

**注意**  
或者，您可以針對 AWS Nitro enclaves 使用 AWS Certificate Manager (ACM)，這是一個 enclave 應用程式，可讓您將公有和私有 SSL/TLS 憑證與在具有 AWS Nitro Enclaves 的 Amazon EC2 執行個體上執行的 Web 應用程式和伺服器搭配使用。Nitro Enclaves 是 Amazon EC2 功能，可建立隔離運算環境，保護並安全處理高度敏感資料，例如 SSL/TLS 憑證和私有金鑰。  
ACM for Nitro Enclaves 可搭配在您 Amazon EC2 Linux 執行個體上執行的 **nginx**，建立私有金鑰、分配憑證和私有金鑰，以及管理憑證續約。  
若要使用 ACM for Nitro Enclaves，您必須使用啟用飛地的 Linux 執行個體。  
如需詳細資訊，請參閱[什麼是 AWS Nitro Enclaves？](https://docs.aws.amazon.com/enclaves/latest/user/nitro-enclave.html) 《[AWS Certificate Manager Nitro Enclaves 使用者指南》中的 和 for](https://docs.aws.amazon.com/enclaves/latest/user/nitro-enclave-refapp.html) *AWS Nitro Enclaves*。

**Topics**
+ [先決條件](#ssl_prereq)
+ [步驟 1：在伺服器上啟用 TLS](#ssl_enable)
+ [步驟 2：取得 CA 簽署的憑證](#ssl_certificate)
+ [步驟 3：測試和強化安全組態](#ssl_test)
+ [疑難排解](#troubleshooting)

## 先決條件
<a name="ssl_prereq"></a>

開始本教學之前，請先完成下列步驟：
+ 啟動 Amazon EBS 支援的 AL2 執行個體。如需詳細資訊，請參閱《*Amazon EC2 使用者指南*》中的[啟動執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-instance-wizard.html)。
+ 設定安全群組允許執行個體接受下列 TCP 連接埠上的連線：
  + SSH (連接埠 22)
  + HTTP (連接埠 80)
  + HTTPS (連接埠 443)

  如需詳細資訊，請參閱《*Amazon EC2 使用者指南*》中的[安全群組規則](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules.html)。
+ 安裝 Apache Web 伺服器。如需step-by-step說明，請參閱[教學課程：在 AL2 上安裝 LAMP Web 伺服器](ec2-lamp-amazon-linux-2.md)。只需要 httpd 套件和其相依性，因此您可以忽略包含 PHP 和 MariaDB 的說明。
+ 若要識別和驗證網站，TLS 公有金鑰基礎設施 (PKI) 依賴網域名稱系統 (DNS)。若要使用 EC2 執行個體來託管公有網站，您需要註冊 Web 伺服器的網域名稱，或將現有網域名稱傳輸至 Amazon EC2 主機。現有多個第三方網域註冊和 DNS 託管服務可用，或者您可以使用 [Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html)。

## 步驟 1：在伺服器上啟用 TLS
<a name="ssl_enable"></a>

**選項：使用自動化完成此教學課程**  
若要使用 AWS Systems Manager 自動化而非下列任務來完成本教學課程，請執行[自動化文件](https://console.aws.amazon.com/systems-manager/documents/AWSDocs-Configure-SSL-TLS-AL2/)。

此程序會引導您完成使用自我簽署數位憑證在 AL2 上設定 TLS 的程序。

**注意**  
自簽憑證可用於測試環境，而非生產環境。如果您在網際網路公開自簽憑證，來您網站光顧的訪客將會收到安全警告。

**在伺服器上啟用 TLS**

1. [連線至執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-to-linux-instance.html)，並確認 Apache 正在執行。

   ```
   [ec2-user ~]$ sudo systemctl is-enabled httpd
   ```

   如果傳回的值不是 "enabled"，請啟動 Apache，並設定為每次系統開機時都啟動。

   ```
   [ec2-user ~]$ sudo systemctl start httpd && sudo systemctl enable httpd
   ```

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/certs/make-dummy-cert`

     用來為伺服器主機產生自我簽署 X.509 憑證和私有金鑰的指令碼。對於測試 Apache 是否已妥善設定以使用 TLS，本憑證可派上用場。因為不提供身分證明，請勿用在生產環境中。如果用在生產環境中，則會在 Web 瀏覽器中觸發警告。

1. 執行下列指令碼，以產生用於測試的自我簽署虛擬憑證和金鑰。

   ```
   [ec2-user ~]$ cd /etc/pki/tls/certs
   sudo ./make-dummy-cert localhost.crt
   ```

   這會在 `localhost.crt` 目錄中產生新檔案 `/etc/pki/tls/certs/`。指定的檔案名稱符合 **SSLCertificateFile** 中的 `/etc/httpd/conf.d/ssl.conf` 指示詞所指派的預設值。

   此檔案包含自我簽署憑證和憑證的私有金鑰。Apache 規定憑證和金鑰必須是 PEM 格式，此格式由 "BEGIN" 和 "END" 行所框住的 Base64 編碼 ASCII 字元構成，如下方的憑證縮寫範例所示。

   ```
   -----BEGIN PRIVATE KEY-----
   MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQD2KKx/8Zk94m1q
   3gQMZF9ZN66Ls19+3tHAgQ5Fpo9KJDhzLjOOCI8u1PTcGmAah5kEitCEc0wzmNeo
   BCl0wYR6G0rGaKtK9Dn7CuIjvubtUysVyQoMVPQ97ldeakHWeRMiEJFXg6kZZ0vr
   GvwnKoMh3DlK44D9dX7IDua2PlYx5+eroA+1Lqf32ZSaAO0bBIMIYTHigwbHMZoT
   ...
   56tE7THvH7vOEf4/iUOsIrEzaMaJ0mqkmY1A70qQGQKBgBF3H1qNRNHuyMcPODFs
   27hDzPDinrquSEvoZIggkDMlh2irTiipJ/GhkvTpoQlv0fK/VXw8vSgeaBuhwJvS
   LXU9HvYq0U6O4FgD3nAyB9hI0BE13r1HjUvbjT7moH+RhnNz6eqqdscCS09VtRAo
   4QQvAqOa8UheYeoXLdWcHaLP
   -----END PRIVATE KEY-----                    
   
   -----BEGIN CERTIFICATE-----
   MIIEazCCA1OgAwIBAgICWxQwDQYJKoZIhvcNAQELBQAwgbExCzAJBgNVBAYTAi0t
   MRIwEAYDVQQIDAlTb21lU3RhdGUxETAPBgNVBAcMCFNvbWVDaXR5MRkwFwYDVQQK
   DBBTb21lT3JnYW5pemF0aW9uMR8wHQYDVQQLDBZTb21lT3JnYW5pemF0aW9uYWxV
   bml0MRkwFwYDVQQDDBBpcC0xNzItMzEtMjAtMjM2MSQwIgYJKoZIhvcNAQkBFhVy
   ...
   z5rRUE/XzxRLBZOoWZpNWTXJkQ3uFYH6s/sBwtHpKKZMzOvDedREjNKAvk4ws6F0
   CuIjvubtUysVyQoMVPQ97ldeakHWeRMiEJFXg6kZZ0vrGvwnKoMh3DlK44D9dlU3
   WanXWehT6FiSZvB4sTEXXJN2jdw8g+sHGnZ8zCOsclknYhHrCVD2vnBlZJKSZvak
   3ZazhBxtQSukFMOnWPP2a0DMMFGYUHOd0BQE8sBJxg==
   -----END CERTIFICATE-----
   ```

   檔案名稱和副檔名僅為使用上的方便，不會影響功能。例如，只要 `cert.crt` 檔案中的相關指示詞使用相同的名稱，您就可以呼叫憑證 `cert.pem`、`ssl.conf` 或其他檔案名稱。
**注意**  
當您將預設 TLS 檔案取代為自己的自訂檔案時，請確認自訂檔案為 PEM 格式。

1. 使用偏好的文字編輯器 (例如 **vim** 或 **nano**)，以根使用者身分開啟 `/etc/httpd/conf.d/ssl.conf` 檔案並加入下列註解，因為自我簽署的虛擬憑證也包含此金鑰。如果您沒有加入此列註解就完成下列步驟，Apache 服務會無法開始。

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

1. 重新啟動 Apache。

   ```
   [ec2-user ~]$ sudo systemctl restart httpd
   ```
**注意**  
請確定可以在 EC2 執行個體上存取 TCP 連接埠 443，如先前所述。

1. Apache Web 伺服器現在應該支援透過連接埠 443 的 HTTPS (安全 HTTP)。測試方式是將 EC2 執行個體的 IP 地址或完整網域名稱加上字首 **https://** 後，一起輸入到瀏覽器 URL 列。

   因為您要使用自簽的不受信任主機憑證連線至網站，所以瀏覽器可能會顯示一系列的安全警告。請覆寫警告，並繼續前往網站。

   如果預設 Apache 測試頁面開啟，即表示您已於伺服器順利設定 TLS。現在所有在瀏覽器與伺服器之間傳遞的資料皆會加密。
**注意**  
為了避免網站訪客碰到警告畫面，您必須取得 CA 簽署的受信任憑證，其不僅會加密也可將您公開驗證為網站擁有者。

## 步驟 2：取得 CA 簽署的憑證
<a name="ssl_certificate"></a>

您可以使用下列程序取得 CA 簽署的憑證：
+ 從私有金鑰產生憑證簽署請求 (CSR)
+ 將 CSR 提交至憑證授權機構 (CA)
+ 取得簽署的主機憑證
+ 設定 Apache 來使用憑證

在密碼編譯方面，自簽的 TLS X.509 主機憑證與 CA 簽署的憑證完全相同。兩者的差異在於往來的形式，無關數學性質。CA 允諾會至少先驗證網域的所有權，再將憑證發給申請人。每個 Web 瀏覽器皆含有受瀏覽器廠商信任能執行這項操作的 CA 名單。X.509 憑證主要包含對應至私有伺服器金鑰的公有金鑰，以及以密碼編譯方式繫結至公有金鑰的 CA 簽章。瀏覽器透過 HTTPS 連接至 Web 伺服器時，伺服器會呈現憑證給瀏覽器，讓瀏覽器檢查其信任的 CA 名單。如果簽署者位於名單上，或可透過包含其他受信任簽署者的「信任鏈」**存取，瀏覽器會與伺服器協議一快速加密資料通路，並載入頁面。

憑證通常因包含驗證請求的勞力而需耗費成本，因此請貨比三家。一些 CA 免費提供基本層級憑證。這些 CA 當中最值得注意的是 [Let's Encrypt](https://letsencrypt.org/) 專案，此專案也支援自動化憑證建立和續約程序。如需使用 Let's Encrypt 憑證的詳細資訊，請參閱[取得 Certbot](https://eff-certbot.readthedocs.io/en/stable/install.html)。

如果您打算提供商業級服務，[AWS Certificate Manager](https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html) 會是不錯的選擇。

主機憑證的基礎就是金鑰。自 2019 年起，[政府](http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r4.pdf)和[產業](https://cabforum.org/wp-content/uploads/CA-Browser-Forum-BR-1.6.5.pdf)團體建議採用最小金鑰 (模數) 大小為 2048 位元的 RSA 金鑰，用以保護文件至 2030 年。AL2 中 OpenSSL 產生的預設模數大小為 2048 位元，適用於 CA 簽署的憑證。對於需要自訂金鑰的人員，例如具有較大模數或使用不同加密演算法的金鑰，以下程序提供選用的步驟。

**重要**  
除非您擁有已註冊和託管的 DNS 網域，否則有關取得 CA 簽署的主機憑證的這些指示將不適用。

**取得 CA 簽署的憑證**

1.  [連線至執行個體](https://docs.aws.amazon.com/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://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r4.pdf)，其密碼編譯強度略大於 2048 位元 RSA 金鑰。
**注意**  
有別於 RSA 金鑰，並非所有 CA 都能為橢圓曲線型金鑰提供相同層級的支援。

   請確定新的私有金鑰具有高限制的所有權和許可 (擁有者=root、群組=root、僅限擁有者的讀寫權)。命令如下範例所示。

   ```
   [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.aws.amazon.com/zh_tw/linux/al2/ug/SSL-on-amazon-linux-2.html)

   最後，OpenSSL 會提示您輸入選用的挑戰密碼。此密碼只會套用至 CSR 以及您與 CA 之間的交易，因此請遵循 CA 對於這個和另一個選用欄位 (選用公司名稱) 的建議。CSR 挑戰密碼不會影響伺服器操作。

   產生的檔案 **csr.pem** 會包含您的公有金鑰、您公有金鑰的數位簽章，以及您輸入的中繼資料。

1. 將 CSR 提交給 CA。這通常包含在文字編輯器開啟 CSR 檔案，以及將內容複製至 Web 表單。此時，系統可能會要求您提供要放在憑證上的一或多個主體別名 (SAN)。如果 **www.example.com** 是通用名稱，則 **example.com** 會是不錯的 SAN，反之亦然。輸入其中任一名稱的網站訪客會看到無錯誤連線。如果您的 CA Web 表單允許這項操作，請在 SAN 清單中包含通用名稱。部分 CA 會自動予以包含。

   在核准您的請求之後，您會收到 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`目錄中，檢查檔案擁有權、群組和許可設定是否符合高限制的 AL2 預設值 （擁有者=根、群組=根、僅供擁有者讀取/寫入）。以下範例顯示要使用的命令。

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

   中繼憑證檔案的許可較不嚴格 (擁有者=root、群組=root、擁有者可以寫入、群組可以讀取、世界可以讀取)。以下範例顯示要使用的命令。

   ```
   [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`目錄中，使用下列命令來驗證檔案擁有權、群組和許可設定是否符合高限制的 AL2 預設值 （擁有者=根、群組=根、僅供擁有者讀取/寫入）。

   ```
   [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
      ```
**注意**  
部分 CA 會將主機憑證和中繼憑證結合至單一檔案，讓 `SSLCACertificateFile` 指示詞變得不必要。請參閱 CA 所提供的說明。

   1. 在 Apache 的 `custom.key` 指示詞中，提供私有金鑰 (在此範例中為 `SSLCertificateKeyFile`) 的路徑和檔案名稱：

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

1. 儲存 `/etc/httpd/conf.d/ssl.conf`，並重新啟動 Apache。

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

1. 在瀏覽器 URL 列輸入網域名稱 (字首為 `https://`)，以測試伺服器。瀏覽器應該會透過 HTTPS 載入測試頁面，而不會產生錯誤。

## 步驟 3：測試和強化安全組態
<a name="ssl_test"></a>

在您的 TLS 運作並向大眾公開之後，您應測試其實際安全程度。這項操作能夠利用線上服務輕鬆完成，例如 [Qualys SSL Labs](https://www.ssllabs.com/ssltest/analyze.html) 可免費為您的安全設定執行透徹的分析。根據結果，您可以決定透過控制所接受的通訊協定、偏好的密碼，以及排除的項目，來強化預設安全組態。如需詳細資訊，請參閱 [how Qualys formulates its scores](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)，以及發現之項目的詳細分析。下表摘要說明網域的報告，其設定與 AL2 上的預設 Apache 組態相同，且具有預設 Certbot 憑證。


|  |  | 
| --- |--- |
| 整體評分 | B | 
| 憑證 | 100% | 
| 通訊協定支援 | 95% | 
| 金鑰交換 | 70% | 
| 密碼強度 | 90% | 

雖然概觀顯示組態大致上很正確，但詳細報告指出幾個潛在問題，這裡依嚴重程度列出：

✗ **支援某些較舊的瀏覽器使用 RC4 加密。**加密是加密演算法的數學核心。用來加密 TLS 資料串流的快速加密 RC4 已知有數個[嚴重缺點](http://www.imperva.com/docs/hii_attacking_ssl_when_using_rc4.pdf)。除非您有絕佳理由來支援舊版瀏覽器，否則應該停用此功能。

✗ **支援舊版 TLS。**此組態支援 TLS 1.0 (已廢除) 和 TLS 1.1 (即將廢除)。自 2018 年起，只建議使用 TLS 1.2。

✗ **不完全支援前向保密。**[前向保密](https://en.wikipedia.org/wiki/Forward_secrecy)是使用衍生自私有金鑰之暫時 (短暫) 工作階段金鑰來加密的演算法的一項功能。這表示攻擊者實際上無法解密 HTTPS 資料，即使他們擁有 Web 伺服器的長期私有金鑰也是一樣。

**更正和打造前瞻性的 TLS 組態**

1. 在文字編輯器中開啟組態檔案 `/etc/httpd/conf.d/ssl.conf`，在下一行的開頭輸入 "\$1"，以變更為註解。

   ```
   #SSLProtocol all -SSLv3
   ```

1. 新增下列指示詞：

   ```
   #SSLProtocol all -SSLv3
   SSLProtocol -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** 指示詞的區段，在現有一行的開頭輸入 "\$1"，以變更為註解。

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

1. 指定明確的加密套件，並指定加密順序將前向保密列為優先，避免不安全的加密。這裡使用的 `SSLCipherSuite` 指示詞是根據 [Mozilla SSL Configuration Generator](https://mozilla.github.io/server-side-tls/ssl-config-generator/) 的輸出，此工具可針對您伺服器上執行的特定軟體來量身打造 TLS 組態。首先，根據下列命令的輸出來確定您的 Apache 和 OpenSSL 版本。

   ```
   [ec2-user ~]$ yum list installed | grep httpd
   
   [ec2-user ~]$ yum list installed | grep openssl
   ```

   例如，如果傳回的資訊是 Apache 2.4.34 和 OpenSSL 1.0.2，我們會在產生器中輸入此資訊。如果您選擇 "modern" 相容性模型，則會建立 `SSLCipherSuite` 指示詞來強制實施安全性，但仍適用於大多數瀏覽器。如果您的軟體不支援新式組態，您可以更新軟體或改為選擇 "intermediate" 組態。

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

   挑選的加密在名稱中包含 *ECDHE* (*Elliptic Curve Diffie-Hellman Ephemeral* 的縮寫)。*ephemeral* 這個字表示前向保密。附帶效果是這些加密不支援 RC4。

   建議您使用明確密碼清單，而不是依賴預設值或是內容不可見的簡潔指示詞。

   將產生的指示詞複製到 `/etc/httpd/conf.d/ssl.conf` 中。
**注意**  
指示詞複製到 `/etc/httpd/conf.d/ssl.conf` 時必須是單行，而且加密名稱之間只有冒號 (沒有空格)，這裡顯示成多行是為了方便閱讀。

1. 最後，移除下列這一行開頭的 "\$1"，以取消註解。

   ```
   #SSLHonorCipherOrder on
   ```

   此指示詞會強制伺服器優先選擇排名較高的加密，包括 (在此案例中) 支援前向保密的加密。開啟此指示詞時，伺服器會先嘗試建立嚴密的安全連線，再備援至具有較低安全的允許密碼。

完成這兩道程序後，請儲存 `/etc/httpd/conf.d/ssl.conf` 的變更，並重新啟動 Apache。

如果您在 [Qualys SSL Labs](https://www.ssllabs.com/ssltest/analyze.html) 上重新測試網域，應該會發現 RC4 漏洞和其他警告已消失，而摘要如下所示。


|  |  | 
| --- |--- |
| 整體評分 | A | 
| 憑證 | 100% | 
| 通訊協定支援 | 100% | 
| 金鑰交換 | 90% | 
| 密碼強度 | 90% | 

每個 OpenSSL 更新都會產生新密碼，並移除舊密碼的支援。將您的 EC2 AL2 執行個體保持在up-to-date、留意來自 [OpenSSL](https://www.openssl.org/) 的安全公告，並留意技術媒體中新安全性漏洞的報告。

## 疑難排解
<a name="troubleshooting"></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 systemctl restart httpd
  ```

  Apache 現在應該會啟動，而且系統不會提示您輸入密碼。
+  **我在執行 sudo yum install -y mod\$1ssl 時收到錯誤。**

  在您安裝 SSL 的必要套件時，可能會看到與下列類似的錯誤。

  ```
  Error: httpd24-tools conflicts with httpd-tools-2.2.34-1.16.amzn1.x86_64
  Error: httpd24 conflicts with httpd-2.2.34-1.16.amzn1.x86_64
  ```

  這通常表示您的 EC2 執行個體未執行 AL2。本教學課程僅支援從官方 AL2 AMI 新建立的執行個體。