nginx、Apache、Lighttpd啟用HSTS
http://www.ttlsa.com/web/hsts-for-nginx-apache-lighttpd/
302跳轉
通常情況下,我們將用戶的 HTTP 請求 302 跳轉到 HTTPS,這會存在兩個問題:
不夠安全,302 跳轉會暴露用戶訪問站點,也容易被劫持
拖慢訪問速度,302 跳轉需要一個 RTT(The role of packet loss and round-trip time),瀏覽器執行跳轉也需要時間
HSTS
302 跳轉是由瀏覽器觸發的,服務器無法完全控制,這個需求導致了 HSTS(HTTP Strict Transport Security)的誕生。HTSP 就是添加 header 頭(add_header Strict-Transport-Security max-age=15768000;includeSubDomains),告訴瀏覽器網站使用 HTTPS 訪問,支持HSTS的瀏覽器(Chrome, firefox, ie 都支持了 HSTS(http://caniuse.com/#feat=stricttransportsecurity))就會在後面的請求中直接切換到 HTTPS。在 Chrome 中會看到瀏覽器自己會有個 307 Internal Redirect 的內部重定向。在一段時間內也就是max-age定義的時間,不管用戶輸入www.ttlsa.com還是http://www.ttlsa.com,都會默認將請求內部跳轉到https://www.ttlsa.com。
服務器端配置HSTS,減少302跳轉,其實HSTS的最大作用是防止302 HTTP劫持。HSTS的缺點是瀏覽器支持率不高,另外配置HSTS後HTTPS很難實時降級成HTTP。
同時,也建議啟用SPDY來提高性能。有關SPDY內容參見前面文章,不在此外累述了。
下面來說說如何在Apache2, NGINX , Lighttpd啟用HSTS。
Apache2
# Optionally load the headers module:
LoadModule headers_module modules/mod_headers.so
<VirtualHost 0.0.0.0:443>
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
</VirtualHost>
然後,重啟Apache服務。
nginx
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
在server端添加該頭部,並重啟服務。
Lighttpd
server.modules += ( "mod_setenv" )
$HTTP["scheme"] == "https" {
setenv.add-response-header = ( "Strict-Transport-Security" => "max-age=63072000; includeSubdomains; preload")
}
X-Frame-Options 頭部
X-Frame-Options 頭部添加到HTTPS站點,確保不會嵌入到frame 或 iframe,避免點擊劫持,以確保網站的內容不會嵌入到其他網站。
Apache
Header always set X-Frame-Options DENY
nginx
add_header X-Frame-Options "DENY";
Lighttpd
server.modules += ( "mod_setenv" )
$HTTP["scheme"] == "https" {
setenv.add-response-header = ( "X-Frame-Options" => "DENY")
}
nginx、Apache、Lighttpd啟用HSTS