首頁  >  文章  >  運維  >  nginx是如何設定HSTS的

nginx是如何設定HSTS的

王林
王林轉載
2023-05-14 16:37:182015瀏覽

Netcraft 公司最近公佈了他們檢測SSL/TLS網站的研究,並指出只有僅僅5%的用戶正確執行了HTTP嚴格傳輸安全HSTS。

什麼是HSTS

HTTPS(SSL和TLS)確保使用者和網站通訊流程中安全,使攻擊者難以攔截、修改和假冒。當使用者手動輸入網域名稱或http://鏈接,該網站的第一個請求是未加密的,使用普通的http。最安全的網站立即發送回一個重定向使用戶引向到https連接,然而,中間人攻擊者可能會攻擊攔截初始的http請求,從而控制用戶後續的回話。

自然而然HSTS應運而生為了解決這潛在的安全問題。即時用戶輸入網域名稱或http連接,瀏覽器將嚴格的升級到https連接。

nginx是如何設定HSTS的

HSTS如何運作的

HSTS策略是從安全的HTTPS網站發送的HTTP回應頭部發布的。

Strict-Transport-Security: max-age=31536000

當瀏覽器從HTTPS網站看到這個頭部,就知道網域只能透過HTTPS(SSL 或 TLS)存取了。並將此資訊快取到31536000,也就是1年。

可選的參數includeSubDomains告訴瀏覽器該策略適用於目前網域下的所有子網域。

Strict-Transport-Security: max-age=31536000; includeSubDomains

nginx設定HSTS

在nginx設定檔上設定HSTS回應頭部。

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

always 參數確保所有的回應設定該頭部,包括內部產生的錯誤回應。 nginx版本早於1.7.5不支援此always參數和內部產生的錯誤回應不設定該頭部資訊。

add_header指令繼承規則:

nginx配置區塊繼承add_header指令所在的封裝區塊,因此只需將add_header指令放在頂層的server區塊。另外還有一個重要的例外,如果一個區塊包含了add_header指令本身,它不會從封裝區塊繼承該頭部,你需要重新定義所有的add_header指令。

server {
    listen 443 ssl;
 
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
 
    # This 'location' block inherits the STS header
    location / {
        root /usr/share/nginx/html;
    }
 
    # Because this 'location' block contains another 'add_header' directive,
    # we must redeclare the STS header
    location /servlet {
        add_header X-Served-By "My Servlet Handler";
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
        proxy_pass http://localhost:8080;
    }
}

測試HTTP嚴格傳輸安全性:

一旦使用者提出HSTS策略,它的快取資訊期由max-age指定。在此期間,瀏覽器將會拒絕透過未加密的HTTP存取web服務,並拒絕給予例外憑證錯誤(如果該網站以前提交了一個有效可信的憑證)。如果指定了一個includeSubDomanis參數,這些限制也同樣適用於目前域下的所有子域。

當你測試HSTS時,max-age時間設定短點。

是否每個HTTPS回應需要有一個STS頭部:

我們的目標是當使用者開始HTTPS回話時,盡可能快速的呈現HSTS策略。如果他們在回話期間接收到HSTS策略,他們仍然容易受到HTTP劫持攻擊的。瀏覽器只需查看一次STS頭部,因此它不是嚴格必要將它添加到每個位置區塊和每個回應。然而,只在主頁或登陸頁面添加它可能是不夠的,如果你只添加到快取的回應,客戶端可能無法看到它。確保盡可能多的合理的覆蓋到你的URL,特別注意動態的內容。

HTTP和HTTPS並行

有時網站需要同時運行在HTTP和HTTPS下

server {
    listen  80;
    listen  443 ssl;
    ...
}

有時,需要將http請求重定向到https

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
 
    # Discourage deep links by using a permanent redirect to home page of HTTPS site
    return 301 https://$host;
 
    # Alternatively, redirect all HTTP links to the matching HTTPS page
    # return 301 https://$host$request_uri;
}
 
server {
    listen 443 ssl;
    server_name www.ttlsa.com;
 
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}

加強HSTS

保護客戶端從HTTP攔截,從它看到STS頭部到宣告的max-age的期間內。然而,HSTS並不是HTTP回話劫持的完美解決方案。使用者仍然容易受到攻擊,如果他們透過HTTP訪問HSTS保護的網站時:

  1. #以前從未訪問過該網站

  2. 最近重新安裝了其作業系統

  3. 最近重新安裝了其瀏覽器

  4. #切換到新的瀏覽器

  5. #切換到一個新的裝置如行動電話

  6. 刪除瀏覽器的快取

  7. 最近沒造訪過該站並且max -age過期了

為了解決這個問題,google堅持維護了一個「HSTS preload list」的網站域名和子域名,並透過https://hstspreload.appspot.com/提交其域名。該網域清單被分發和硬編碼到主流的web瀏覽器。用戶端存取此清單中的網域名稱將主動的使用HTTPS,並拒絕使用HTTP存取該網站。

一旦設定了STS頭部或提交了你的網域到HSTS預加載列表,這是不可能將其刪除的。這是一個單向的決定使你的網域可以透過HTTPS可用的。

以上是nginx是如何設定HSTS的的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除