26.6. 設定提供 SSL 的安全網頁伺服器

如果網頁伺服器和用戶端之間會傳輸例如信用卡資訊等敏感性資料,這時最好要提供安全、加密連線的驗證方式。mod_ssl 會為用戶端和網頁伺服器之間的 HTTP 通訊,提供使用安全通訊端層 (Secure Sockets Layer, SSL)、以及傳輸層安全性 (Transport Layer Security, TLS) 通訊協定的強式加密。使用 SSL/TSL 時,網頁伺服器和用戶端之間就會建立私人 (Private) 連線。如此便可確保資料完整性,使用戶端和伺服器端可以彼此進行驗證。

為了完成這個目的,伺服器會在回覆任何 URL 要求之前,先傳送提供伺服器有效身分相關資訊的 SSL 憑證。這樣一來,就可以保證該伺服器是此通訊的唯一專屬正確端點。此外,該憑證會在用戶端和伺服器端建立加密連線,以便在沒有洩漏敏感、純文字內容的風險情況下傳輸資訊。

mod_ssl 不會實作 SSL/TSL 通訊協定本身,而是扮演 Apache 和 SSL 程式庫之間的介面。在 SUSE Linux 中是使用 OpenSSL 程式庫。OpenSSL 會自動隨 Apache 完成安裝。

使用 mod_ssl 搭配 Apache 的最明顯特徵,就是 URL 的字首都會加上 https://,而不是 http://

26.6.1. 建立 SSL 憑證

為了讓 SSL/TSL 搭配網頁伺服器使用,您必須建立 SSL 憑證。網頁伺服器和用戶端在彼此驗證時必須用到這項憑證,以便讓任一方可以彼此清楚識別。為了確保憑證的完整性,其必須由每位使用者信任的一方加以簽章。

您可以建立下列三種類型的憑證:僅供測試使用的 "虛擬" 憑證、供已定義信任圈使用者使用的自我簽發憑證,以及由獨立、公開的憑證授權機構 (CA) 簽發的憑證。

憑證建立基本上可分為兩個步驟程序。首先產生憑證授權機構的私密金鑰,接著再使用該金鑰簽發伺服器憑證。

[Tip]更多資訊

若要更進一步認識 SSL/TSL 的概念和定義,請參閱 http://httpd.apache.org/docs/2.2/ssl/ssl_intro.html

26.6.1.1. 建立 "虛擬" 憑證

產生虛擬憑證的步驟很簡單。您只要呼叫程序檔 /usr/bin/gensslcert,便可建立此類憑證,或是覆寫下列檔案:

  • /etc/apache2/ssl.crt/ca.crt

  • /etc/apache2/ssl.crt/server.crt

  • /etc/apache2/ssl.key/server.key

  • /etc/apache2/ssl.csr/server.csr

ca.crt 的複製本也會放在 /srv/www/htdocs/CA.crt 提供下載。

[Important]重要

虛擬憑證絕對不可用於生產環境系統。這類憑證只能用於測試目的。

26.6.1.2. 建立自我簽發憑證

如果您要設定供內部網路 (Intranet)、或已定義信任圈使用者使用的安全網頁伺服器,透過您本身憑證授權機構 (CA) 簽發憑證就可有效符合此時的憑證需求。

建立自我簽發憑證包括連續互動的 9 大步驟程序。請切換至目錄 /usr/share/doc/packages/apache2,並執行下列指令 ./mkcert.sh make --no-print-directory /usr/bin/openssl /usr/sbin/ custom。請勿嘗試從這個目錄外面執行這個指令。這個程式會提供一系列提示訊息,其中有部分提示需要使用者輸入。

過程 26.1. 使用 mkcert.sh 建立自我簽發憑證

  1. 決定憑證所使用的簽章演算法

    選擇 RSA (R,此為預設選項),因為有些早期瀏覽器無法使用 DSA。

  2. 產生 CA 的 RSA 私密金鑰 (1024 位元)

    這時不須進行任何互動。

  3. 產生 CA 的 X.509 憑證簽發要求

    在此建立 CA 的供辨識名稱。這時系統會要求您回答一些問題,例如國名或組織名稱。請輸入有效資料,因為您在此輸入的每項資料都會顯示在憑證中。您不需要回答每個問題。如果有不適用於您的問題項目或是您希望保留空白,請使用 "."。一般名稱是指 CA 本身的名稱 -- 請選擇明顯的名稱,例如 My company CA。

  4. 產生 CA 本身簽發的 X.509 憑證

    選擇憑證版本 3 (預設選項)。

  5. 產生 SERVER 的 RSA 私密金鑰 (1024 位元)

    這時不須進行任何互動。

  6. 產生 SERVER 的 X.509 憑證簽發要求

    在此建立伺服器金鑰的供識別名稱。這時要回答的問題與 CA 供識別名稱相關問題幾乎都一樣。在此輸入的資料會套用到網頁伺服器,因此不需要和 CA 資料完全相同 (例如,伺服器可能會出現任意位置)。

    [Important]選取一般名稱

    您在此輸入的一般名稱必須是安全伺服器的完整主機名稱 (例如,www.example.com)。否則瀏覽器會在存取網頁伺服器時發出警告,表示憑證與伺服器不相符。

  7. 產生本身 CA 簽發的 X.509 憑證

    選擇憑證版本 3 (預設選項)。

  8. 使用通行短語為 CA 的 RSA 私密金鑰加密,以提高安全性

    我們強烈建議您使用密碼來加密 CA 的私密金鑰,請選擇 Y 來輸入密碼。

  9. 使用通行短語為 SERVER 的 RSA 私密金鑰加密,以提高安全性

    當您使用密碼為伺服器金鑰加密時,每當您要啟動該網頁伺服器時就必須輸入這個密碼。採取這種做法時,就很難自動在開機時啟動伺服器或是重新啟動網頁伺服器。因此,使用者通常會在回答這個問題時選擇 N。請注意金鑰在沒有使用密碼加密時是不受保護狀態,同時請確定只有經授權人員可以存取該金鑰。

    [Important]加密伺服器金鑰

    如果您選擇使用密碼為伺服器金鑰進行加密,請為存放在 /etc/sysconfig/apache2APACHE_TIMEOUT 提高設定值。否則,您在嘗試啟動伺服器之前可能來不及輸入通行短語,但是伺服器早就啟動失敗而停止。

程序檔的結果頁面會出現憑證清單,以及其所產生的金鑰。不同於程序檔輸出的結果,這些檔案並不是產生到本機目錄 conf,而是產生到 /etc/apache2/ 下面的正確目錄。

最後一個步驟就是從 /etc/apache2/ssl.crt/ca.crt 將 CA 憑證檔案複製到使用者可存取的位置,以便使用者將該檔案納入其網頁瀏覽器已知和信任的 CA 清單中。否則,瀏覽器會報告該憑證是由不明授權機構所簽發。這類憑證的有效期限是一年。

[Important]自我簽發憑證

自我簽發憑證只能用在供可識別您、且信任您為憑證授權機構之使用者存取的網頁伺服器上。我們不建議您在例如公開商店等場所中使用這類憑證。

26.6.1.3. 取得官方簽發憑證

目前有一些可簽發憑證的官方憑證授權機構。這類憑證是由值得信任的第三方所簽發,因此可以完全信任。對外運作的安全網頁伺服器通常已取得官方簽發憑證。

最有名的官方 CA 是 Thawte (http://www.thawte.com/ 或 Verisign (www.verisign.com)。這些 CA 和其他 CA 都已經編譯到所有瀏覽器中,所以瀏覽器會自動接受這些憑證授權機構簽發的憑證。

當您在要求官方簽發憑證時,您並不需要向 CA 發送憑證。而是發出憑證簽發要求 (Certificate Signing Request, CSR)。若要建立 CSR,請呼叫程序檔 /usr/share/ssl/misc/CA.sh -newreq

首先,程序檔會要求該 CSR 進行加密時所使用的密碼。接著,要求您輸入供識別的名稱。這時系統會要求您回答一些問題,例如國名或組織名稱。請輸入有效資料 -- 您在此時輸入的每項資料將來都會顯示在憑證中並用於檢查。您不需要回答每個問題。如果有不適用於您的問題項目或是您希望保留空白,請使用 "."。一般名稱是指 CA 本身的名稱 -- 請選擇明顯的名稱,例如 My company CA。最後,必須輸入挑戰密碼和替用的公司名稱。

從您呼叫程序檔的目錄中找出此 CSR。這個檔案名稱是 newreq.pem

26.6.2. 設定提供 SSL 的 Apache

在網頁伺服器端上,SSL 和 TLS 要求的預設連接埠是 443。這樣和"一般" Apache 傾聽連接埠 80、SSL/TLS 啟用 Apache 傾聽連接埠 443 之間,就不會產生衝突。事實上,HTTP 和 HTTPS 可以執行相同的 Apache 例項。通常這時會使用不同的虛擬主機,將連接埠 80 和連接埠 443 的要求分派到不同的虛擬伺服器。

[Important]防火牆組態

請不要忘記為連接埠 443 上已啟用 SSL 的 Apache 開啟防火牆。 您可以依據節 4.1.4.1, "使用 YaST 設定"所述方式,透過 YaST 完成這個動作。

若要使用 SSL,這項功能必須在全域伺服器組態中完成啟動。請在編輯器中開啟 /etc/sysconfig/apache2,並搜尋 APACHE_MODULES。將 "ssl" 加入到模組清單中 (若清單中沒有出現此模組,mod_ssl 是已預設啟動的模組)。接下來,搜尋 APACHE_SERVER_FLAGS 並加入 "SSL"。如果已經選擇使用密碼來加密伺服器憑證,您就必須同時提高 APACHE_TIMEOUT 的設定值,以便您在啟動 Apache 時有足夠時間輸入該密碼。請重新啟動伺服器來確保這些變更生效。只是重新載入並無法保證變更生效。

虛擬主機組態目錄包含了樣板 /etc/apache2/vhosts.d/vhost-ssl.template 和 SSL 特定指示詞 (將提供詳細文件說明)。如需一般虛擬主機組態的詳細資訊,請參閱節 26.2.1.2, "虛擬主機組態"

若要開始執行,請先確實調整下列指示詞的設定值:

  • DocumentRoot

  • ServerName

  • ServerAdmin

  • ErrorLog

  • TransferLog

[Important]以名稱為基礎的虛擬主機和 SSL

我們不可能在只有一個 IP 位址的伺服器上,執行多部啟用 SSL 的虛擬主機。連線到這類設定的使用者,將會在每次造訪該 URL 時收到警告訊息,表示憑證與伺服器名稱不符。每個啟用 SSL 的領域都需要使用不同的 IP 位址或連接埠,才能根據有效的 SSL 憑證來完成通訊。