以前基於nginx爲網站配置了HTTPS服務,配置過程當中涉及到兩個知識點:php
本文主要是經過梳理一下相關概念,理清這兩種配置的目的。html
HTTPS,也稱做HTTP over TLS,TLS的前身是SSL。HTTPS 相比 HTTP 提供了數據完整性、 數據隱私性和身份認證的功能。nginx
SSL通訊過程 web
在nginx中的配置方法算法
server {
listen 443;
server_name www.example.com; #填寫綁定證書的域名
ssl on;
ssl_certificate /etc/nginx/sslconfig/1_www.example.com_bundle.crt;
ssl_certificate_key /etc/nginx/sslconfig/2_www.example.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
root html; #站點目錄
index index.html index.htm;
# proxy_pass http://$server_name:8920;
}
複製代碼
中間人攻擊(Man-in-the-middle attack,縮寫:MITM)是指攻擊者與通信的兩端分別創建獨立的聯繫,並交換其所收到的數據,使通信的兩端認爲他們正在經過一個私密的鏈接與對方直接對話,但事實上整個會話都被攻擊者徹底控制並進行數據篡改和嗅探。瀏覽器
HSTS,即HTTP Strict-Transport-Security。 當站點經過 HTTPS 運行的時候,服務器經過返回一個響應頭部 Strict-Transport-Security
,強制瀏覽器之後使用 HTTPS 進行通訊。緩存
Strict-Transport-Security: max-age=<expire-time>
Strict-Transport-Security: max-age=<expire-time>; includeSubDomains
Strict-Transport-Security: max-age=<expire-time>; preload
複製代碼
一個網站接受一個 HTTP 的請求,而後跳轉到 HTTPS ,用戶可能在開始跳轉前,經過沒有加密的方式和服務器對話,這樣存在中間人攻擊潛在威脅,跳轉過程可能被惡意網站利用來直接接觸用戶信息,而不是原來的加密信息。
HTST 是在初次經過訪問 HTTPS 鏈接並返回安全頭以後,瀏覽器記錄下這些信息。有效期內,當瀏覽器再次試圖經過 HTTP 與服務器創建鏈接只會返回307 Temporary Redirect
,瀏覽器禁止加載 HTTP 信息,並將鏈接重定向到 HTTPS 。一個測試的結果以下:安全
在nginx中配置響應信息bash
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
複製代碼
瀏覽器返回結果 服務器
注意 HTST 是經過 HTTPS 響應頭設置的,若是使用 HTTP 則會被忽略。一種解決的策略是 preload HTST。HSTS預加載是把你的網站和或域名放在一個被承認的hsts列表上,這個列表其實是內置在瀏覽器中的。Google提供了這個列表服務,並由Chrome、Firefox、Opera、Safari、IE11和Edge使用,能夠將你的站點提交到官方的HSTS預加載列表。HTTP 301 永久重定向
說明請求的資源已經被移動到了由 Location 頭部指定的url上,是固定的不會再改變,搜索引擎會根據該響應修正,在 SEO 中301跳轉對網站的權重會產生影響。
咱們注意到,咱們已經在nginx中已經配置了return 301 https://$server_name$request_uri
,將HTTP請求重定向到HTTPS。可是,在前面的瀏覽器測試結果中,經過HTTP訪問並無顯示301永久重定向,而是307臨時重定向。實際上,301 仍然是發生的,301是服務器層面上的重定向,而307是瀏覽器層面上的重定向。咱們經過 httpstatus 進行測試,能夠看到直觀的結果:
咱們已經說明了HSTS和301的做用,可是咱們可能仍然有些困惑:
總之,中間人攻擊不可能簡單地經過某一種策略來徹底阻止,可是聊勝於無,HSTS 仍然是個可行的安全策略。
參考了一些博客和討論,若有錯誤歡迎指正。