教學課程:在 Amazon Linux 2 上設定 SSL/TLS - Amazon Elastic Compute Cloud

教學課程:在 Amazon Linux 2 上設定 SSL/TLS

Secure Sockets Layer/Transport Layer Security (SSL/TLS) 會在 Web 伺服器與 Web 用戶端之間建立加密通路,保護傳輸中的資料以防遭到竊聽。本教學說明如何在具有 Amazon Linux 2 和 Apache Web 伺服器的 EC2 執行個體上手動新增 SSL/TLS 支援。如果您打算提供商業級服務,未在此詳加討論的 AWS Certificate Manager 會是不錯的選擇。

基於歷史因素,Web 加密通常僅簡單以 SSL 指稱。雖然 Web 瀏覽器仍然支援 SSL,但其後來的通訊協定 TLS 較不易受攻擊。Amazon Linux 2 預設會在伺服器端停止支援所有 SSL 版本。安全標準機構認為 TLS 1.0 不安全,IETF 已著手準備正式廢除 TLS 1.0 與 TLS 1.1。本教學課程包含完全基於啟用 TLS 1.2 的指導 (存在較新的 TLS 1.3 通訊協定,但未預設安裝在 Amazon Linux 2 上)。 如需更新之加密標準的詳細資訊,請參閱 RFC 7568RFC 8446

本教學課程簡單地以 TLS 指稱現代 Web 加密。

重要

這些程序專用於 Amazon Linux 2。我們也假設您使用的是全新 Amazon EC2 執行個體。如果您嘗試具有不同版本的執行個體上設定 LAMP Web 伺服器,或者您要重新啟用較舊的現有執行個體,則本教學中的某些程序可能不適用。如需 Ubuntu 上 LAMP Web 伺服器的資訊,請參閱 Ubuntu 社群文件 ApacheMySQLPHP。如需 Red Hat Enterprise Linux 的資訊,請參閱客戶入口網站主題:Web Servers

先決條件

開始本教學之前,請先完成下列步驟:

  • 啟動 EBS 後端 Amazon Linux 2 執行個體。如需更多詳細資訊,請參閱 步驟 1:啟動執行個體

  • 設定安全群組允許執行個體接受下列 TCP 連接埠上的連線:

    • SSH (連接埠 22)

    • HTTP (連接埠 80)

    • HTTPS (連接埠 443)

    如需詳細資訊,請參閱 授權 Linux 執行個體的傳入流量

  • 安裝 Apache Web 伺服器。如需逐步說明,請參閱教學:在 Amazon Linux 2 上安裝 LAMP Web 伺服器。只需要 httpd 套件和其相依性,因此您可以忽略包含 PHP 和 MariaDB 的說明。

  • 若要識別和驗證網站,TLS 公有金鑰基礎設施 (PKI) 依賴網域名稱系統 (DNS)。若要使用 EC2 執行個體來託管公有網站,您需要註冊 Web 伺服器的網域名稱,或將現有網域名稱傳輸至 Amazon EC2 主機。現有多個第三方網域註冊和 DNS 託管服務可用,或者您可以使用 Amazon Route 53

步驟 1:在伺服器上啟用 TLS

本程序將引導您使用自簽數位憑證在 Amazon Linux 2 上設定 TLS。

注意

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

在伺服器上啟用 TLS

  1. 連線至執行個體,並確認 Apache 正在執行。

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

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

    [ec2-user ~]$ sudo systemctl start httpd && sudo systemctl enable httpd
  2. 為確保所有軟體套件皆為最新版本,請對您的執行個體執行快速軟體更新。本程序可能需費時幾分鐘,但確定您擁有最新的安全更新和錯誤修正至關重要。

    注意

    -y 選項不要求確認就會安裝更新。如果您要先檢查更新再安裝,則可以省略此選項。

    [ec2-user ~]$ sudo yum update -y
  3. 現在您的執行個體為最新,請安裝 Apache 模組 mod_ssl 來新增 TLS 支援。

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

    您的執行個體現在有下列檔案,供您用來設定安全伺服器和建立用於測試的憑證:

    • /etc/httpd/conf.d/ssl.conf

      mod_ssl 的組態檔案。檔案中包含的指示詞會告知 Apache 可在何處找到加密金鑰和憑證、要允許的 TLS 通訊協定版本,以及要接受的加密密碼。

    • /etc/pki/tls/certs/make-dummy-cert

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

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

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

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

    此檔案包含自我簽署憑證和憑證的私有金鑰。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.pemssl.conf 或其他檔案名稱。

    注意

    當您將預設 TLS 檔案取代為自己的自訂檔案時,請確認自訂檔案為 PEM 格式。

  5. 開啟 /etc/httpd/conf.d/ssl.conf 檔案並加入下列註解,因為自我簽署的虛擬憑證也包含此金鑰。如果您沒有加入此列註解就完成下列步驟,Apache 服務會無法開始。

    SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
  6. 重新啟動 Apache。

    [ec2-user ~]$ sudo systemctl restart httpd
    注意

    請確定可以在 EC2 執行個體上存取 TCP 連接埠 443,如先前所述。

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

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

    如果預設 Apache 測試頁面開啟,即表示您已於伺服器順利設定 TLS。現在所有在瀏覽器與伺服器之間傳遞的資料皆會加密。

    注意

    為了避免網站訪客碰到警告畫面,您必須取得 CA 簽署的受信任憑證,其不僅會加密也可將您公開驗證為網站擁有者。

步驟 2:取得 CA 簽署的憑證

您可以使用下列程序取得 CA 簽署的憑證:

  • 從私有金鑰產生憑證簽署請求 (CSR)

  • 將 CSR 提交至憑證授權機構 (CA)

  • 取得簽署的主機憑證

  • 設定 Apache 來使用憑證

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

憑證通常因包含驗證請求的勞力而需耗費成本,因此請貨比三家。您可以在 dmoztools.net 找到推薦 CA 名單。一些 CA 免費提供基本層級憑證。這些 CA 當中最值得注意的是 Let's Encrypt 專案,此專案也支援自動化憑證建立和續約程序。如需使用 Let's Encrypt 做為 CA 的詳細資訊,請參閱憑證自動化:在 Amazon Linux 2 上使用 Let's Encrypt 搭配 Certbot

主機憑證的基礎就是金鑰。自 2019 年起,政府產業團體建議採用最小金鑰 (模數) 大小為 2048 位元的 RSA 金鑰,用以保護文件至 2030 年。Amazon Linux 2 中 OpenSSL 所產生的預設模數大小為 2048 位元,適用於 CA 簽署的憑證。對於需要自訂金鑰的人員,例如具有較大模數或使用不同加密演算法的金鑰,以下程序提供選用的步驟。

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

取得 CA 簽署的憑證

  1. 連線至執行個體,並導覽至 /etc/pki/tls/private/。這是存放伺服器的 TLS 私有金鑰的目錄。如果您偏好使用現有主機金鑰來產生 CSR,請跳到步驟 3。

  2. (選用) 產生新私有金鑰。以下是金鑰組態的一些範例。任何產生的金鑰皆可用於您的 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,其密碼編譯強度略大於 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。

  3. 使用偏好的金鑰建立 CSR。以下範例使用 custom.key

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

    OpenSSL 會開啟對話方塊,並提示您輸入下表中顯示的資訊。對於基本的已驗證網域之主機憑證,Common Name (通用名稱) 以外的所有欄位皆為選用欄位。

    名稱 描述 範例
    Country Name (國家/地區名稱) 兩個字母的 ISO 縮寫,用來代表您的國家/地區。 US (=美國)
    State or Province Name (州或省名稱) 您組織位在的州名或省名。此名稱不得使用縮寫。 華盛頓州
    Locality Name (地區名稱) 您組織的位置 (例如城市)。 西雅圖
    Organization Name (組織名稱) 您組織的完整法定名稱。請不要使用您組織名稱的縮寫。 範例公司
    Organizational Unit Name (組織單位名稱) 額外組織資訊 (如果有的話)。 範例部門
    Common Name (通用名稱)

    此值必須完全符合您預期使用者會在瀏覽器輸入的網址。這通常表示字首為主機名稱或別名的網域名稱,格式為 www.example.com。在使用自簽憑證且沒有 DNS 解析的測試中,通用名稱可能只包含主機名稱。CA 也提供費用較高的憑證,其可接受萬用字元名稱 (例如 *.example.com)。

    www.example.com
    電子郵件地址 伺服器管理員的電子郵件地址。 someone@example.com

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

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

  4. 將 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 或類似副檔名的檔案。

  5. 將新的 CA 簽署憑證和任何中繼憑證放在 /etc/pki/tls/certs 目錄中。

    注意

    有數種方式可以將新的憑證上傳至 EC2 執行個體,但最直接且有益的方式是在本機電腦和執行個體上開啟文字編輯器 (例如,vi、nano 或記事本),然後在其間複製和貼上檔案內容。對 EC2 執行個體執行這些操作時,您需要有 root [sudo] 許可。因此,您可以立即看到是否有任何許可或路徑問題。不過,請注意不要在複製內容時新增其他行,或以任何方式變更它們。

    /etc/pki/tls/certs 目錄內,確認檔案所有權、群組和許可設定符合高限制的 Amazon Linux 2 預設值 (擁有者=root、群組=root、僅限擁有者的讀寫權)。以下範例顯示要使用的命令。

    [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
  6. 將您用來建立 CSR 的私有金鑰放在 /etc/pki/tls/private/ 目錄中。

    注意

    有數種方式可以將自訂金鑰上傳至 EC2 執行個體,但最直接且有益的方式是在本機電腦和執行個體上開啟文字編輯器 (例如,vi、nano 或記事本),然後在其間複製和貼上檔案內容。對 EC2 執行個體執行這些操作時,您需要有 root [sudo] 許可。因此,您可以立即看到是否有任何許可或路徑問題。不過,請注意不要在複製內容時新增其他行,或以任何方式變更它們。

    /etc/pki/tls/private 目錄內,使用下列命令來驗證檔案所有權、群組和許可設定符合高限制的 Amazon Linux 2 預設值 (擁有者=root、群組=root、僅限擁有者的讀寫權)。

    [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
  7. 編輯 /etc/httpd/conf.d/ssl.conf 以反映新的憑證和金鑰檔案。

    1. 在 Apache 的 SSLCertificateFile 指示詞中,提供 CA 簽署主機憑證的路徑和檔案名稱:

      SSLCertificateFile /etc/pki/tls/certs/custom.crt
    2. 如果您收到中繼憑證檔案 (在此範例中為 intermediate.crt),請使用 Apache 的 SSLCACertificateFile 指示詞提供其路徑和檔案名稱:

      SSLCACertificateFile /etc/pki/tls/certs/intermediate.crt
      注意

      部分 CA 會將主機憑證和中繼憑證結合至單一檔案,讓 SSLCACertificateFile 指示詞變得不必要。請參閱 CA 所提供的說明。

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

      SSLCertificateKeyFile /etc/pki/tls/private/custom.key
  8. 儲存 /etc/httpd/conf.d/ssl.conf,並重新啟動 Apache。

    [ec2-user ~]$ sudo systemctl restart httpd
  9. 在瀏覽器 URL 列輸入網域名稱 (字首為 https://),以測試伺服器。瀏覽器應該會透過 HTTPS 載入測試頁面,而不會產生錯誤。

步驟 3:測試和強化安全組態

在您的 TLS 運作並向大眾公開之後,您應測試其實際安全程度。這項操作能夠利用線上服務輕鬆完成,例如 Qualys SSL Labs 可免費為您的安全設定執行透徹的分析。根據結果,您可以決定透過控制所接受的通訊協定、偏好的密碼,以及排除的項目,來強化預設安全組態。如需詳細資訊,請參閱 how Qualys formulates its scores

重要

實際測試對於伺服器安全而言十分重要。微小的組態錯誤可能會導致嚴重安全漏洞和資料遺失。由於建議的安全實務為因應研究與浮現的威脅而持續地變動,所以定期安全稽核是良好伺服器管理的必要項目。

Qualys SSL Labs 網站上,輸入伺服器的完整網域名稱,格式為 www.example.com。約兩分鐘之後,您會收到網站的評等 (從 A 到 F),以及發現之項目的詳細分析。下表摘要說明網域的報告,其中的設定與 Amazon Linux 2 上的預設 Apache 組態相同,而且具有預設 Certbot 憑證。

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

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

支援某些較舊的瀏覽器使用 RC4 加密。 加密是加密演算法的數學核心。用來加密 TLS 資料串流的快速加密 RC4 已知有數個嚴重缺點。除非您有絕佳理由來支援舊版瀏覽器,否則應該停用此功能。

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

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

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

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

    #SSLProtocol all -SSLv3
  2. 新增下列指示詞:

    #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 指示詞的區段,在現有一行的開頭輸入 "#",以變更為註解。

    #SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
  2. 指定明確的加密套件,並指定加密順序將前向保密列為優先,避免不安全的加密。這裡使用的 SSLCipherSuite 指示詞是根據 Mozilla SSL Configuration Generator 的輸出,此工具可針對您伺服器上執行的特定軟體來量身打造 TLS 組態。(如需詳細資訊,請參閱 Mozilla 的實用資源 Security/Server Side 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 時必須是單行,而且加密名稱之間只有冒號 (沒有空格),這裡顯示成多行是為了方便閱讀。

  3. 最後,移除下列這一行開頭的 "#",以取消註解。

    #SSLHonorCipherOrder on

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

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

如果您在 Qualys SSL Labs 上重新測試網域,應該會發現 RC4 漏洞和其他警告已消失,而摘要如下所示。

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

每個 OpenSSL 更新都會產生新密碼,並移除舊密碼的支援。將 EC2 Amazon Linux 2 執行個體保持為最新狀態,並留意來自 OpenSSL 的安全公告,並注意技術新聞中新安全漏洞的報告。如需詳細資訊,請參閱 Classic Load Balancer 使用者指南 中的 Elastic Load Balancing 的預先定義 SSL 安全政策

故障診斷

  • 除非我提供密碼,否則我的 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_ssl 時發生錯誤。

    在您安裝 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 執行個體未執行 Amazon Linux 2。本教學僅支援從正式 Amazon Linux 2 AMI 全新建立的執行個體。

憑證自動化:在 Amazon Linux 2 上使用 Let's Encrypt 搭配 Certbot

Let's Encrypt 憑證授權機構為 Electronic Frontier Foundation (EFF) 的作業重心,致力於加密整個網際網路。為了符合該目標,Let's Encrypt 主機憑證的設計旨在能於人力介入最少的情況下建立、驗證、安裝和維護。憑證管理的自動化部分是由 Web 伺服器上執行的軟體代理程式所執行。在您安裝和設定代理程式之後,即會安全地與 Let's Encrypt 通訊,並在 Apache 和金鑰管理系統上執行管理任務。本教學使用免費的 Certbot 代理程式,因為它可讓您提供自訂的加密金鑰做為憑證的基礎,或允許代理程式本身根據其預設值來建立金鑰。您也可以設定 Certbot 在沒有人力互動的情況下定期續約憑證,如自動化 Certbot所述。如需詳細資訊,請參閱 Certbot 使用者指南手冊頁

Certbot 在 Amazon Linux 2 上未正式支援,但可供安裝,且安裝之後可正確運作。建議您製作下列備份,藉以保護資料並避免不便:

  • 開始之前,請建立 Amazon EBS 根磁碟區的快照。這可讓您還原 EC2 執行個體的原始狀態。如需建立 EBS 快照的資訊,請參閱建立 Amazon EBS 快照

  • 下面的程序需要您編輯 httpd.conf 檔案,以控制 Apache 的操作。Certbot 會依此與其他組態檔案自動地自行變更。建立您整個 /etc/httpd 目錄的備份,以備日後需還原之時。

準備安裝

請先完成下列程序,再安裝 Certbot。

  1. 下載 Extra Packages for Enterprise Linux (EPEL) 7 儲存庫套件。這些是提供 Certbot 所需之相依性的必要項目。

    1. 導覽至您的主目錄 (/home/ec2-user)。使用下列命令下載 EPEL。

      [ec2-user ~]$ sudo wget -r --no-parent -A 'epel-release-*.rpm' http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/
    2. 安裝儲存庫套件,如下列命令所示。

      [ec2-user ~]$ sudo rpm -Uvh dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-*.rpm
    3. 啟用 EPEL,如下列命令所示。

      [ec2-user ~]$ sudo yum-config-manager --enable epel*

      您可藉下列命令確認 EPEL 已經啟用。應會傳回類似如下的資訊。

      [ec2-user ~]$ sudo yum repolist all ... epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 enabled: 12949+175 epel-debuginfo/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 - Debug enabled: 2890 epel-source/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 - Source enabled: 0 epel-testing/x86_64 Extra Packages for Enterprise Linux 7 - Testing - x86_64 enabled: 778+12 epel-testing-debuginfo/x86_64 Extra Packages for Enterprise Linux 7 - Testing - x86_64 - Debug enabled: 107 epel-testing-source/x86_64 Extra Packages for Enterprise Linux 7 - Testing - x86_64 - Source enabled: 0 ...
  2. 編輯主要 Apache 組態檔案 /etc/httpd/conf/httpd.conf。找到 "Listen 80" 指示詞,並於其後新增下列數行,將範例網域名稱取代為實際通用名稱和主體別名 (SAN)。

    <VirtualHost *:80> DocumentRoot "/var/www/html" ServerName "example.com" ServerAlias "www.example.com" </VirtualHost>

    儲存檔案,並重新啟動 Apache。

    [ec2-user ~]$ sudo systemctl restart httpd

安裝和執行 Certbot

本程序根據用於在 FedoraRHEL 7 上安裝 Certbot 的 EFF 文件。它說明 Certbot 的預設使用,會產生 2048 位元 RSA 金鑰的憑證。

  1. 使用下列命令,安裝 Certbot 套件和相依性。

    [ec2-user ~]$ sudo yum install -y certbot python2-certbot-apache
  2. 執行 Certbot。

    [ec2-user ~]$ sudo certbot
  3. 在 "Enter email address (used for urgent renewal and security notices)" (輸入電子郵件地址 (用於緊急續約和安全聲明)) 提示時,輸入聯絡地址,並按 Enter 鍵。

  4. 在提示中,同意 Let's Encrypt 服務條款。輸入 "A",然後按 Enter 繼續。

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must agree in order to register with the ACME server at https://acme-v02.api.letsencrypt.org/directory - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (A)gree/(C)ancel: A
  5. 在授權 EFF 將您放入其郵寄清單時,請輸入 "Y" 或 "N",然後按 Enter 鍵。

  6. Certbot 會顯示您在 VirtualHost 區段中提供的通用名稱和主體別名 (SAN)。

    Which names would you like to activate HTTPS for? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: example.com 2: www.example.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate numbers separated by commas and/or spaces, or leave input blank to select all options shown (Enter 'c' to cancel):

    保留輸入空白,然後按 Enter 鍵。

  7. Certbot 會在建立憑證和設定 Apache 時顯示下列輸出。接著會提示您將 HTTP 查詢重新導向至 HTTPS。

    Obtaining a new certificate Performing the following challenges: http-01 challenge for example.com http-01 challenge for www.example.com Waiting for verification... Cleaning up challenges Created an SSL vhost at /etc/httpd/conf/httpd-le-ssl.conf Deploying Certificate for example.com to VirtualHost /etc/httpd/conf/httpd-le-ssl.conf Enabling site /etc/httpd/conf/httpd-le-ssl.conf by adding Include to root configuration Deploying Certificate for www.example.com to VirtualHost /etc/httpd/conf/httpd-le-ssl.conf Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

    若要允許訪客透過未加密 HTTP 連線至伺服器,請輸入 "1"。如果您想要只接受透過 HTTPS 的加密連線,請輸入 "2"。按 Enter 鍵,提交您的選擇。

  8. Certbot 會完成 Apache 的組態,並報告成功和其他資訊。

    Congratulations! You have successfully enabled https://example.com and https://www.example.com You should test your configuration at: https://www.ssllabs.com/ssltest/analyze.html?d=example.com https://www.ssllabs.com/ssltest/analyze.html?d=www.example.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/certbot.oneeyedman.net/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/certbot.oneeyedman.net/privkey.pem Your cert will expire on 2019-08-01. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. To non-interactively renew *all* of your certificates, run "certbot renew" - Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal.
  9. 在您完成安裝之後,請測試和最佳化伺服器的安全,如步驟 3:測試和強化安全組態中所述。

設定自動化憑證續約

Certbot 的設計旨在成為您伺服器系統中之隱藏且與錯誤絕緣的部分。Certbot 預設會產生短暫 (90 天過期時間) 的主機憑證。如果您尚未設定系統自動呼叫命令,則必須在過期之前先手動重新執行 certbot 命令。本程序示範如何設定 Cron 任務來自動化 Certbot。

自動化 Certbot

  1. 使用 sudovimnano 等文字編輯器中開啟 /etc/crontab 檔案。或使用 sudo crontab -e

  2. 新增與下列類似的行並儲存檔案。

    39 1,13 * * * root certbot renew --no-self-upgrade

    以下是每個元件的說明:

    39 1,13 * * *

    排程命令在每天的 01:39 和 13:39 執行。選取的值是任意的,但 Certbot 開發人員建議每天至少執行命令兩次。這麼做保證能迅速地撤銷和取代任何受侵害的憑證。

    root

    此命令會使用根許可執行。

    certbot renew --no-self-upgrade

    要執行的命令。renew 子命令會讓 Certbot 檢查任何先前取得的憑證,以及續約即將過期的憑證。--no-self-upgrade 標記可避免 Certbot 在沒有您的介入的情況下即自行升級。

  3. 重新啟動 Cron 協助程式。

    [ec2-user ~]$ sudo systemctl restart crond