認為採用 HTTPS 和 HTTP 嚴格傳輸安全性的惡意中間人

Mike West

由於個人資料數量龐大,透過一系列可透過網際網路傳輸的資料,加密並不是我們應該或應該輕忽的。新式瀏覽器提供多種機制,可用於確保使用者資料在傳輸過程中安全無虞:安全的 Cookie嚴格傳輸安全性是其中兩大要素。可讓您順暢地保護使用者、將連線升級為 HTTPS,並保證使用者資料絕不會直接傳送。

這麼做有什麼好處?請考慮以下幾點:

比起將未密封的信封寄給在街道上,第一人看起來是走在郵局的方向上,但透過未加密的 HTTP 連線提供網頁的做法,則有所不同。如果你很幸運,她可能會一路走完,或者也可以把它交給下一位看到誰正想正確的人。那個人可能也會做同樣的事,依此類推

這種即興鏈的大多數陌生人都值得信賴,永遠不會察覺或更改公開信件。不過,字母改變手部的次數越多,代表你所寄出信件的完整存取權的人數越多。說到底,您信件的收件者很可能在郵件中看到「東西」,但它與您一開始提交的問題是否「相同」是開放的問題。或許你該把這封信封上...

中間人

要更好或更糟的是,網路上可觀的大量內容取決於陌生人的可信度。伺服器不會直接彼此連線,而是在這款巨大的電話遊戲中,將要求和回應從路由器傳送至路由器。

您可以透過 traceroute 查看這些躍點的實際運作情形。從電腦到 HTML5Rocks 的路線看起來會像這樣:

$ traceroute html5rocks.com
traceroute to html5rocks.com (173.194.71.102), 30 hops max, 60 byte packets
 1  router1-lon.linode.com (212.111.33.229)  0.453 ms
 2  212.111.33.233 (212.111.33.233)  1.067 ms
 3  217.20.44.194 (217.20.44.194)  0.704 ms
 4  google1.lonap.net (193.203.5.136)  0.804 ms
 5  209.85.255.76 (209.85.255.76)  0.925 ms
 6  209.85.253.94 (209.85.253.94)  1.226 ms
 7  209.85.240.28 (209.85.240.28)  48.714 ms
 8  216.239.47.12 (216.239.47.12)  22.575 ms
 9  209.85.241.193 (209.85.241.193)  36.033 ms
10  72.14.233.180 (72.14.233.180)  43.222 ms
11  72.14.233.170 (72.14.233.170)  43.242 ms
12  *
13  lb-in-f102.1e100.net (173.194.71.102)  44.523 ms

13 個躍點也不是壞事。但是,如果我透過 HTTP 傳送要求,則每個中繼路由器都可存取我的要求和伺服器回應的完整存取權。所有資料都會以未加密的明文形式傳輸,任何這些中介者都可以充當「中間的男性」、讀取我的資料,甚至操控傳輸中的資料。

更糟的是,這種攔截事件幾乎無法被偵測到。惡意修改的 HTTP 回應看起來就像有效回應,因為沒有任何機制可讓您確保接收到的資料「確切」就是傳送的資料。如果有人決定想讓網際網路上下顛倒,我就更難辦到。

這是安全專線嗎?

從純文字 HTTP 改用安全的 HTTPS 連線,可以提供抵禦中間人的最佳防禦。HTTPS 連線會在任何資料傳送前對整個管道進行端對端加密,因此您與目的地之間的機器就無法讀取或修改傳輸中的資料。

Chrome 的網址列會提供有關連線狀態的詳細資訊。
Chrome 的網址列會提供有關連線狀態的詳細資訊。

安全性 HTTPS 以公開和私人加密編譯金鑰的概念為基礎。進一步探討細節 (幸好) 並不在本文的討論範圍,但核心概念非常簡單:以特定公開金鑰加密的資料「只能」使用對應的私密金鑰解密。當瀏覽器啟動 HTTPS 握手以建立安全通道時,伺服器會提供憑證來為瀏覽器提供所有必要資訊,以驗證伺服器是否擁有適當的私密金鑰。從該點以後的所有通訊都會經過加密,以證明要求確實傳送至經過驗證的伺服器,以及從驗證伺服器接收的回應。

因此,您可以確保自己與所通訊的伺服器進行通訊,而且沒有其他人正在聽取您的連線或傳輸的位元。這類加密程序是確保網路安全性的絕對先決條件;如果您的應用程式目前並未透過 HTTPS 傳送,就容易遭受攻擊。修正問題。Ars Technica 提供完善的免費取得及安裝憑證指南,建議您參考相關技術詳細資料。設定會從供應商、供應商和伺服器到伺服器,但任何位置的憑證要求程序都相同。

預設將安全性納入考量

要求並安裝憑證後,請確保使用者從您付出的心力中獲益:利用 HTTP 重新導向的魔法,將現有使用者遷移至 HTTPS 連線,並確保 Cookie「僅」透過安全連線傳送。

以便

當使用者造訪 http://example.com/ 時,請傳送含有適當 Location 標頭的 301 Moved Permanently 回應,將他們重新導向至 https://example.com/

$ curl -I http://mkw.st/
HTTP/1.1 301 Moved Permanently
Server: nginx/1.3.7
...
Keep-Alive: timeout=20
Location: https://mkw.st/

您可以在 Apache 或 Nginx 等伺服器中輕鬆設定這類重新導向。例如,從 http://example.com/ 重新導向至 https://example.com/ 的 Nginx 設定如下所示:

server {
    listen [YOUR IP ADDRESS HERE]:80;
    server_name example.com www.example.com;
    location "/" {
        rewrite ^(.*) https://www.example.com$1 permanent;
    }
}

Cookie 可讓我們透過無狀態 HTTP 通訊協定,為使用者提供順暢的登入體驗。Cookie 中儲存的資料 (包括工作階段 ID 等機密資訊) 會隨著每個要求一併傳送,讓伺服器瞭解自己在回應的是哪位使用者。確定使用者會透過 HTTPS 造訪我們的網站後,我們也應確保儲存在 Cookie 中的機密資料只會透過安全連線轉移,而且絕對不會以明確的方式傳送。

設定 Cookie 通常涉及的 HTTP 標頭,如下:

set-Cookie: KEY=VALUE; path=/; expires=Sat, 01-Jan-2022 00:00:00 GMT

您可以處理單一關鍵字,指示瀏覽器限制 Cookie 使用 Cookie 的安全工作階段:

Set-Cookie: KEY=VALUE; path=/; expires=Sat, 01-Jan-2022 00:00:00 GMT; secure

凡是透過 secure 關鍵字設定的 Cookie,都不會透過 HTTP 傳送。

正在關閉開啟的視窗

如果以透明化的方式重新導向至 HTTPS,則代表使用者在大部分的情況下造訪您的網站,都會使用安全連線。不過,這麼做會留下一小部分的攻擊機會:初始 HTTP 連線會處於公開狀態,容易遭到 SSL 去除和相關攻擊攻擊。由於中間的人可以完全存取初始 HTTP 要求,因此它可做為您和伺服器之間的 Proxy,因此無論伺服器的意圖為何,都可讓您保持使用不安全的 HTTP 連線。

您可以要求瀏覽器強制執行 HTTP 嚴格傳輸安全性 (HSTS),藉此降低這類攻擊的風險。傳送 Strict-Transport-Security HTTP 標頭會指示瀏覽器在不接觸網路的情況下,執行 HTTP 到 HTTPS 重新導向的用戶端 (這也會帶來良好效能,因此最好不要發出要求):

$ curl -I https://mkw.st/
HTTP/1.1 200 OK
Server: nginx/1.3.7
...
Strict-Transport-Security: max-age=2592000

支援此標頭的瀏覽器 (目前為 Firefox、Chrome 和 Opera: caniuse: caniuse) 詳細資料會註明此網站要求僅限 HTTPS 的存取權,也就是說,無論使用者以何種方式前往網站,她都會透過 HTTPS 造訪網站。即使她在瀏覽器中輸入 http://example.com/,卻直接使用 HTTPS,完全不需要建立 HTTP 連線。更棒的是,如果瀏覽器偵測到無效的憑證 (也許會試圖假冒您的伺服器身分),使用者就無法透過 HTTP 繼續;全部或全部內容都沒問題。

瀏覽器會在 max-age 秒後過期伺服器的 HSTS 狀態 (本例約為一個月);請將其設為合理的高一些值。

您也可以在標頭中加入 includeSubDomains 指令,確保來源的所有子網域都能受到保護:

$ curl -I https://mkw.st/
HTTP/1.1 200 OK
Server: nginx/1.3.7
...
Strict-Transport-Security: max-age=2592000

放心使用,不費吹灰之力

要順利使用 HTTPS,甚至可以確定您傳送的資料能完整傳送給指定收件者,建議您現在就為網站和應用程式設定安全連線這項程序相當簡單,且能協助保障客戶資料安全。加密管道建立完成後,您應傳送 301 HTTP 回應,公開將使用者重新導向至這個安全連線。接著,請在設定 Cookie 時新增安全關鍵字,確保所有使用者的機密工作階段資訊「只」使用安全連線。完成所有確認操作後,請確保使用者不會意外落入公車:請附加 Strict-Transport-Security 標頭,確保瀏覽器正常運作,以確保使用者能正常運作。

設定 HTTPS 並不容易,而且能為網站和使用者帶來巨大優勢。這絕對值得。

資源

  • StartSSL 提供免費網域驗證憑證。你是無比追求的。無論採用哪種方法,您一定可以採用合理價格,然後再提高驗證等級。
  • 安全資料傳輸層 (SSL) 伺服器測試:當您為伺服器設定 HTTPS 後,請透過 SSL 研究室的伺服器測試執行,確認您已正確執行。您可獲得詳盡的報表,顯示是否已開始運作。
  • Ars Technica 近期發表的「使用 SSL/TLS 保護網路伺服器」一文,有助您進一步瞭解設定伺服器的基本概念。
  • 針對您可能想要的 Strict-Transport-Security 標頭,建議您仔細閱讀 HTTP 嚴格傳輸安全性規格 (RFC6797) 的相關技術資訊。
  • 清楚瞭解執行目標後,下一步就是宣傳您的網站,讓網站只能透過一組特定憑證連上。IETF 還有一項工作,可以讓您透過 Public-Key-Pins 標頭完成這項工作,目前仍在早期開發階段,但值得一試,也值得一試。