在伺服器上啟用 HTTPS

Chris Palmer
Chris Palmer
Matt Gaunt

本頁說明如何在伺服器上設定 HTTPS,包括下列步驟:

  • 建立 2048 位元 RSA 公開/私密金鑰組。
  • 產生嵌入公開金鑰的憑證簽署要求 (CSR)。
  • 將 CSR 提供給憑證授權單位 (CA),以便接收最終憑證或憑證鏈結。
  • 將最終憑證安裝在不可透過網路存取的位置,例如 /etc/ssl (Linux 和 Unix) 或 IIS 要求的位置 (Windows)。

產生金鑰和憑證簽署要求

本節使用大部分 Linux、BSD 和 Mac OS X 系統隨附的 openssl 指令列程式來產生私密金鑰/公開金鑰和 CSR。

產生公開/私密金鑰組

首先,請產生 2,048 位元的 RSA 金鑰組。較短的金鑰可能會受到暴力猜測攻擊,而較長的金鑰則會使用不必要的資源。

請使用下列指令產生 RSA 金鑰組:

openssl genrsa -out www.example.com.key 2048

這會產生以下輸出內容:

Generating RSA private key, 2048 bit long modulus
.+++
.......................................................................................+++
e is 65537 (0x10001)

產生憑證簽署要求

在這個步驟中,您要將公開金鑰和網站相關資訊嵌入憑證簽署要求或 CSR,openssl 指令會要求你提供必要中繼資料。

執行下列指令:

openssl req -new -sha256 -key www.example.com.key -out www.example.com.csr

系統會輸出以下內容:

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.
-----
Country Name (2 letter code) [AU]:CA
State or Province Name (full name) [Some-State]:California
Locality Name (for example, city) []:Mountain View
Organization Name (for example, company) [Internet Widgits Pty Ltd]:Example, Inc.
Organizational Unit Name (for example, section) []:Webmaster Help Center Example
Team
Common Name (e.g. server FQDN or YOUR name) []:www.example.com
Email Address []:webmaster@example.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

若要確保 CSR 的有效性,請執行下列指令:

openssl req -text -in www.example.com.csr -noout

回應應如下所示:

Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=CA, ST=California, L=Mountain View, O=Google, Inc.,
OU=Webmaster Help Center Example Team,
CN=www.example.com/emailAddress=webmaster@example.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:ad:fc:58:e0:da:f2:0b:73:51:93:29:a5:d3:9e:
                    f8:f1:14:13:64:cc:e0:bc:be:26:5d:04:e1:58:dc:
                    ...
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha256WithRSAEncryption
         5f:05:f3:71:d5:f7:b7:b6:dc:17:cc:88:03:b8:87:29:f6:87:
         2f:7f:00:49:08:0a:20:41:0b:70:03:04:7d:94:af:69:3d:f4:
         ...

將 CSR 提交給憑證授權單位

不同憑證授權單位 (CA) 會要求您以不同方式將 CSR 提交給他們。包括使用網站上的表單,或透過電子郵件傳送客戶服務代表。有些 CA 或其經銷商甚至可能會自動化部分或全部程序,包括在某些情況下自動化處理金鑰組和產生 CSR 。

將 CSR 傳送至 CA,然後按照對方的操作說明接收最終憑證或憑證鏈結。

不同的 CA 會針對公開金鑰的保證服務收取不同金額的費用。

您也可以選擇將金鑰對應至多個 DNS 名稱,包括多個不同的名稱 (例如 example.com、www.example.com、example.net 和 www.example.net 的所有名稱) 或「萬用字元」名稱,例如 *.example.com

將憑證複製到所有透過網路存取的前端伺服器,例如 /etc/ssl (Linux 和 Unix) 或 IIS (Windows) 需要這些憑證的位置。

在伺服器上啟用 HTTPS

在伺服器上啟用 HTTPS 是為網頁提供安全的重要步驟。

  • 使用 Mozilla 的伺服器設定工具來為您的伺服器設定 HTTPS 支援。
  • 請定期以 Qualys SSL 伺服器測試來測試您的網站,並確保您取得至少 A 或 A+。

此時,您必須做出關鍵的營運決定。請選擇下列其中一項:

  • 為網路伺服器提供內容的每個主機名稱指定不同的 IP 位址。
  • 使用以名稱為基礎的虛擬託管。

如果您曾針對各個主機名稱使用不同的 IP 位址,您可以同時支援所有用戶端的 HTTP 和 HTTPS。但是,大多數網站營運商使用以名稱為基礎的虛擬主機來保留 IP 位址,而且因為使用起來比較方便。

如果您的伺服器尚未提供 HTTPS 服務,請立即啟用 (不要將 HTTP 重新導向至 HTTPS)。詳情請參閱將 HTTP 重新導向至 HTTPS)。設定網路伺服器以使用您購買及安裝的憑證。Mozilla 的設定產生器可能會對您有幫助。

如果您有多個主機名稱或子網域,每個主機名稱或子網域都必須使用正確的憑證。

現在請定期使用 Qualys SSL 伺服器測試檢查 HTTPS 設定。 網站應以 A 或 A+ 評分。請將可能導致評分降低的項目視為錯誤,並保持警覺,因為我們一直在開發針對演算法和通訊協定的新攻擊,因此請保持警惕。

將內部網址設為相對網址

現在網站是透過 HTTP 和 HTTPS 提供網站,因此無論使用何種通訊協定,都要盡可能確保過程順暢作業。其中一項重要因素就是為內部網站連結使用相對網址。

確認內部網址和外部網址不會仰賴特定通訊協定。 使用相對路徑或排除 //example.com/something.js 中的通訊協定。

使用 HTTPS 提供含有 HTTP 資源的網頁可能會造成問題。如果瀏覽器使用不安全的資源瀏覽其他安全網頁,就會警告使用者該網頁並不安全,且部分瀏覽器會拒絕載入或執行 HTTP 資源,導致網頁發生問題。不過,您可以在 HTTP 頁面中安全地加入 HTTPS 資源。如要進一步瞭解如何修正這些問題,請參閱「修正混合內容」。

此外,透過 HTTP 連結連至網站上的其他網頁,也可以將使用者體驗從 HTTPS 降級至 HTTP。如要修正這個問題,請盡量讓內部網站網址採用相對關係 (缺少通訊協定,以 //example.com 開頭) 或主機相關 (以路徑為開頭,例如 /jquery.js)。

正確做法
<h1>Welcome To Example.com</h1>
<script src="/jquery.js"></script>
<link rel="stylesheet" href="/assets/style.css"/>
<img src="/images/logo.png"/>;
<p>A <a href="/2014/12/24">new post on cats!</a></p>
使用相對內部網址。
正確做法
<h1>Welcome To Example.com</h1>
<script src="//example.com/jquery.js"></script>
<link rel="stylesheet" href="//assets.example.com/style.css"/>
<img src="//img.example.com/logo.png"/>;
<p>A <a href="//example.com/2014/12/24/">new post on cats!</a></p>
或者,使用通訊協定相關內部網址。
正確做法
<h1>Welcome To Example.com</h1>
<script src="/jquery.js"></script>
<link rel="stylesheet" href="/assets/style.css"/>
<img src="/images/logo.png"/>;
<p>A <a href="/2014/12/24">new post on cats!</a></p>
<p>Check out this <a href="https://foo.com/"><b>other cool site.</b></a></p>
盡可能使用 HTTPS 網址指向其他網站的連結。

請以指令碼 (而非手動) 更新連結,避免出錯。如果網站的內容位於資料庫中,請在資料庫的開發副本上測試指令碼。如果您的網站內容只包含簡單的檔案,請在檔案的開發副本上測試指令碼。請照常在變更通過品質確保後,將變更推送至實際工作環境。您可以使用 Bram van Damme 的指令碼或類似方法偵測網站上的複合型內容。

連結至其他網站 (而不是加入其中的資源) 時,請勿變更通訊協定。你無法控制這些網站的運作方式。

為了讓大型網站順利遷移,建議您使用通訊協定相關網址。 如果您不確定是否可以完整部署 HTTPS,強制網站所有子資源都使用 HTTPS 可以恢復運作。在某些情況下,新的 HTTPS 可能會暫時失效,且 HTTP 網站必須繼續正常運作。將持續完成遷移作業,並以 HTTPS 鎖定 (請參閱後續兩節)。

如果您的網站需要使用第三方 (如 CDN 或 jquery.com) 提供的指令碼、圖片或其他資源,則有兩個選項可供選擇:

  • 為這些資源使用通訊協定相關網址。如果第三方並非提供 HTTPS,請要求對方進行。大部分查詢都已經指定網址,包括 jquery.com。
  • 透過由您控管的伺服器提供資源,伺服器同時提供 HTTP 和 HTTPS。這通常是個好主意,因為如此一來,您可以更精確地控制網站的外觀、效能和安全性,而且不必信任第三方,就能維護網站安全。

將 HTTP 重新導向至 HTTPS

如果要告知搜尋引擎使用 HTTPS 存取您的網站,請在每個網頁的標頭使用 <link rel="canonical" href="https://…"/> 標記,放置標準連結

啟用嚴格傳輸安全性與安全 Cookie

您現在可以「鎖定」使用 HTTPS 的方式了:

  • 使用 HTTP 嚴格傳輸安全性 (HSTS) 來避免 301 重新導向的費用。
  • 一律在 Cookie 上設定安全標記。

首先,請使用嚴格傳輸安全性,告知用戶端應一律使用 HTTPS 連線至您的伺服器,即使追蹤 http:// 參照也一樣。這能抵禦 SSL 去除等攻擊,並避免使用「將 HTTP 重新導向至 HTTPS」中所啟用 301 redirect 的來回成本。

如要啟用 HSTS,請設定 Strict-Transport-Security 標頭。OWASP 的 HSTS 頁面含有各種伺服器軟體的操作說明

大多數網路伺服器提供新增自訂標頭的功能十分類似。

另外,要確保用戶端絕不會透過 HTTP 傳送 Cookie (例如驗證或網站偏好設定)。舉例來說,如果使用者的驗證 Cookie 以純文字格式公開,則整個工作階段的安全保證也會遭到刪除,就算您沒有完成其他工作也沒關係。

為了避免這種情況,請將網頁應用程式變更為一律在設定的 Cookie 上設定安全標記。這個 OWASP 頁面說明如何在多種應用程式架構中設定安全標記。每個應用程式架構都可以設定標記。

大部分網路伺服器提供簡單的重新導向功能。使用 301 (Moved Permanently) 向搜尋引擎和瀏覽器指出 HTTPS 版本為標準版本,並將使用者從 HTTP 重新導向至網站的 HTTPS 版本。

搜尋結果排名

Google 會使用 HTTPS 做為正面搜尋品質指標。此外,Google 也會發布指南,說明如何轉移、移動或遷移網站,同時維持網站的搜尋排名。此外,Bing 也發布了網站管理員專用指南

效能

如果內容和應用程式層均已完成調整 (請參閱 Steve Souders 的書籍取得相關建議),與應用程式的整體成本相比,剩餘的 TLS 效能問題通常很少。您也可以減少和分攤這些費用。如需 TLS 最佳化的相關建議,請參閱 Ilya Grigorik 的高效能瀏覽器網路、Ivan Ristic 的 OpenSSL CookbookBulletproof SSL and TLS

在某些情況下,TLS 可以提升效能,這多半是可能使 HTTP/2 變得可行。如要瞭解詳情,請參閱 Chris Palmer 在 2014 年 Chrome 開發人員高峰會中對 HTTPS 和 HTTP/2 效能的討論

參照網址標頭

當使用者追蹤 HTTPS 網站中的連結前往其他 HTTP 網站時,使用者代理程式不會傳送參照網址標頭。如果發生問題,您可以透過以下幾種方式解決問題:

  • 其他網站則應遷移至 HTTPS。如果參照網站已完成本指南的「在伺服器上啟用 HTTPS」一節,您可以將網站上的連結從 http:// 變更為 https://,或使用通訊協定相關連結。
  • 如要解決參照網址標頭的相關問題,請使用新的參照網址政策標準

廣告收益

透過顯示廣告營利的網站營運商,確保廣告遷移至 HTTPS 不會降低廣告曝光。不過,由於混合內容安全疑慮,HTTP <iframe> 無法在 HTTPS 網頁上運作。在廣告客戶透過 HTTPS 發布之前,網站業者無法在不損失廣告收益的情況下遷移至 HTTPS。不過,在網站營運商遷移至 HTTPS 之前,廣告客戶幾乎沒有意願發布 HTTPS。

您可以先使用透過 HTTPS 提供廣告服務的廣告主,並要求完全不使用 HTTPS 的廣告主至少提供此選項,藉此打破過時目標。您可能需要延遲完成「相對網站中網址」,直到有足夠的廣告客戶正確互通為止。