如何配置使用 HTTP 嚴格傳輸安全(HSTS)

jopen 9年前發布 | 8K 次閱讀 HTTP2

HTTP 嚴格傳輸安全(HSTS)是一種安全功能,web 服務器通過它來告訴瀏覽器僅用 HTTPS 來與之通訊,而不是使用 HTTP。本文會說明如何在 Apache2、Nginx 和 Lighttpd 上如何啟用 HSTS。在主流的 web 服務器上測試通過: Nginx 1.1.19、 Lighttpd 1.4.28 和 Apache 2.2.22 ,環境為 Ubuntu 12.04、 Debian 6 & 7 和 CentOS 6,只需要調整部分參數就可以工作在其它的發行版上。

如何配置使用 HTTP 嚴格傳輸安全(HSTS)

什么是 HTTP 嚴格傳輸安全?

引用自 Mozilla Developer Network

如果一個 web 服務器支持 HTTP 訪問,并將其重定向到 HTTPS 訪問的話,那么訪問者在重定向前的初始會話是非加密的。舉個例子,比如訪問者輸入 http://www.foo.com/ 或直接輸入 foo.com 時。

這就給了中間人攻擊的一個機會,重定向可能會被破壞,從而定向到一個惡意站點而不是應該訪問的加密頁面。

HTTP 嚴格傳輸安全(HSTS)功能使 Web 服務器告知瀏覽器絕不使用 HTTP 訪問,在瀏覽器端自動將所有到該站點的 HTTP 訪問替換為 HTTPS 訪問。

以下引自維基百科

HSTS 可以用來抵御 SSL 剝離攻擊。SSL 剝離攻擊是中間人攻擊的一種,由 Moxie Marlinspike 于2009年發明。他在當年的黑帽大會上發表的題為 “New Tricks For Defeating SSL In Practice” 的演講中將這種攻擊方式公開。SSL剝離的實施方法是阻止瀏覽器與服務器創建HTTPS連接。它的前提是用戶很少直接在地址欄輸入https://,用戶總是通過點擊鏈接或3xx重定向,從HTTP頁面進入HTTPS頁面。所以攻擊者可以在用戶訪問HTTP頁面時替換所有https://開頭的鏈接為http://,達到阻止HTTPS的目的。

HSTS可以很大程度上解決SSL剝離攻擊,因為只要瀏覽器曾經與服務器創建過一次安全連接,之后瀏覽器會強制使用HTTPS,即使鏈接被換成了HTTP。

另外,如果中間人使用自己的自簽名證書來進行攻擊,瀏覽器會給出警告,但是許多用戶會忽略警告。HSTS解決了這一問題,一旦服務器發送了HSTS字段,用戶將不再允許忽略警告。

場景舉例:

當你通過一個無線路由器的免費 WiFi 訪問你的網銀時,很不幸的,這個免費 WiFi 也許就是由黑客的筆記本所提供的,他們會劫持你的原始請求,并將其重定向到克隆的網銀站點,然后,你的所有的隱私數據都曝光在黑客眼下。

嚴格傳輸安全可以解決這個問題。如果你之前使用 HTTPS 訪問過你的網銀,而且網銀的站點支持 HSTS,那么你的瀏覽器就知道應該只使用 HTTPS,無論你是否輸入了 HTTPS。這樣就防范了中間人劫持攻擊。

注意,如果你之前沒有使用 HTTPS 訪問過該站點,那么 HSTS 是不奏效的。網站需要通過 HTTPS 協議告訴你的瀏覽器它支持 HSTS。

服務器開啟 HSTS 的方法是,當客戶端通過HTTPS發出請求時,在服務器返回的 HTTP 響應頭中包含 Strict-Transport-Security 字段。非加密傳輸時設置的HSTS字段無效。

在 Apache2 中設置 HSTS

編輯你的 apache 配置文件(如 /etc/apache2/sites-enabled/website.conf 和 /etc/apache2/httpd.conf ),并加以下行到你的 HTTPS VirtualHost:

# Optionally load the headers module:
LoadModule headers_module modules/mod_headers.so

<VirtualHost 67.89.123.45:443>
    Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
</VirtualHost> 

現在你的 web 站點在每次訪問時都會發送該請求頭,失效時間是兩年(秒數)。這個失效時間每次都會設置為兩年后,所以,明天你訪問時,它會設置為明天的兩年后。

你只能在 HTTPS 虛擬機中設置這個頭,而不能設置在 HTTP 虛擬機中。

要將你的訪問者重定向到對應 HTTPS 站點,可使用如下設置:

<VirtualHost *:80>
  [...]
  ServerName example.com
  Redirect permanent / https://example.com/
</VirtualHost> 

如果僅僅是做重定向的話,甚至不需要設置 DocumentRoot。

你也可以使用 mod_rewrite 來做重定向,但是上述的方式更簡單更安全。不過,mod_rewrite 可以重定向頁面到對應的 HTTPS 頁面,而上述配置則只重定向到“/”:

<VirtualHost *:80>
  [...]
  <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
  </IfModule>
</VirtualHost> 

不要忘記重啟 Apache。

Lighttpd

對于 lighttpd 來說很簡單,將下述配置增加到你的 Lighttpd 配置文件(例如:/etc/lighttpd/lighttpd.conf):

server.modules += ( "mod_setenv" )
$HTTP["scheme"] == "https" {
    setenv.add-response-header  = ( "Strict-Transport-Security" => "max-age=63072000; includeSubdomains; preload")
} 

重啟 Lighttpd。失效時間也是兩年。

Nginx

Nginx 甚至更簡單,將下述行添加到你的 HTTPS 配置的 server 塊中:

add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; 

不要忘記重啟 Nginx。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!