HTTP HSTS協議和 nginx

2021-02-19 運維生存時間

Netcraft 公司最近公布了他們檢測SSL/TLS網站的研究,並指出只有僅僅5%的用戶正確執行了HTTP嚴格傳輸安全HSTS。本文介紹nginx如何配置HSTS。

什麼是HSTS

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

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

HSTS如何工作的

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

1

Strict-Transport-Security: max-age=31536000

當瀏覽器從HTTPS站點看到這個頭部,就知道該域名只能通過HTTPS(SSL 或者 TLS)訪問了。並將此信息緩存到31536000,也就是1年。

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

1

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

nginx配置HSTS

在nginx配置文件上設置HSTS響應頭部。

1

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指令。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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下

1

2

3

4

5

server {

    listen  80;

    listen  443 ssl;

    ...

}

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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保護的網站時:

以前從未訪問過該網站

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

最近重新安裝了其瀏覽器

切換到新的瀏覽器

切換到一個新的設備如行動電話

刪除瀏覽器的緩存

最近沒訪問過該站並且max-age過期了

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

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

相關焦點

  • HTTP Strict Transport Security (HSTS) in ASP.NET Core
    協議的概念和應用。HSTS細心的你可能發現,HSTS還是存在一個薄弱漏洞,那就是瀏覽器沒有當前HSTS信息,或者第一次訪問;或者新作業系統,瀏覽器重裝,清除瀏覽器緩存;HSTS信息的max-age過期;依然需要一次明文HTTP請求和重定向才能升級到HTTPS並刷新HSTS信息,這一次依然給攻擊者可乘之機,針對以上攻擊,HSTS的應對辦法是在瀏覽器內置一個域名列表,這個列表內域名,瀏覽器都會使用
  • 開啟HSTS讓瀏覽器強制跳轉HTTPS訪問
    瀏覽器廠商們為了解決這個問題,提出了HSTS Preload List方案:內置一份可以定期更新的列表,對於列表中的域名,即使用戶之前沒有訪問過,也會使用HTTPS協議。目前這個Preload List由Google Chrome維護,Chrome、Firefox、Safari、IE 11和Microsoft Edge都在使用。
  • 談談HSTS超級Cookie
    這裡準備32個域名,並且兩種狀態的URL,一種是set hsts狀態(注意,HSTS必須在HTTPS下才能設置,因此set操作始終發生在https中),另一種是get獲取當前域名下hsts狀態,這裡以0和1來表示。
  • HSTS原理及實踐
    Https連接Https通過加密傳輸和身份認證保證了http協議傳輸過程的安全性,然而這並不意味著你開啟了https網站就絕對安全了
  • 巧用客戶端防禦 - 談談HSTS
    HSTS是HTTP Strict Transport Security響應頭的簡稱,它的主要作用是防止協議降級攻擊,如SSL剝離中間人攻擊。HSTS是一種IETF標準協議, 具體可參見RFC6797。    在日常的瀏覽習慣中,除了通過搜尋引擎之外,大部分用戶會直接在地址欄中輸入網址進行訪問,但是其中的大多數用戶為了方便,都直接輸入網址而忽略輸入協議。例如訪問百度,輸入www.baidu.com,而不是https://www.baidu.com。
  • 解決缺陷,讓HSTS變得完美
    作者:王繼波野狗科技運維總監,曾在360、TP-Link從事網絡運維相關工作,在網站性能優化、網絡協議研究上經驗豐富
  • 伺服器啟用HSTS協議
    採用HSTS協議的網站將保證瀏覽器始終連接到該網站的HTTPS加密版本,不需要用戶手動在URL地址欄中輸入加密地址。該協議將幫助網站採用全局加密,用戶看到的就是該網站的安全版本。HSTS的作用是強制客戶端(如瀏覽器)使用HTTPS與伺服器創建連接。
  • 在Nginx中支持HTTP3.0/QUIC
    核心是QUIC(讀音quick)協議,由Google在2015年提出的SPDY v3演化而來的新協議,傳統的HTTP協議是基於傳輸層TCP的協議,而QUIC是基於傳輸層UDP上的協議,可以定義成:HTTP3.0基於UDP的安全可靠的HTTP2.0協議,主要有以下特性:圖片來自Nginx官博本文主要講解一下如何在Nginx中開啟HTTP3.0的支持
  • NGINX Plus 現在完全支持 HTTP/2
    作為 HTTP 協議的最新標準,HTTP/2 的設計為現在的 web 應用程式帶來了更高的性能和安全性。(LCTT 譯註: 開源版本的 NGINX 1.95 也支持 HTTP/2 了。)NGINX Plus 所實現的 HTTP/2 協議可與現有的網站和應用程式進行無縫銜接。
  • 如何在 Nginx 中啟用 HTTP 3.0/QUIC 支持
    Nginx 官方 Nginx-quic 項目:今年 6 月1 0 日,Nginx 官博[3]發布公告稱已經在研發支持 HTTP3.0/QUIC 協議的工作,目前項目維護在 nginx-quic[4],該項目和基於 Cloudflare 基於 Nginx 的分支並無關係,算是相對於正統的方案。
  • 為什麼我們要使用HTTP Strict Transport Security?
    一個網站接受一個HTTP的請求,然後跳轉到HTTPS,用戶可能在開始跳轉前,通過沒有加密的方式和伺服器對話,比如,用戶輸入http://foo.com或者直接foo.com。這樣存在中間人攻擊潛在威脅,跳轉過程可能被惡意網站利用來直接接觸用戶信息,而不是原來的加密信息。
  • Nginx 下實現 HTTP/2 伺服器推送 (Server Push) 教程
    $ docker container stop mynginx現在要為容器加入 HTTPS 支持,第一件事就是生成私鑰和證書。正式的證書需要證書當局(CA)的籤名,這裡是為了測試,搞一張自籤名(self-signed)證書就可以了。
  • 什麼是HSTS,為什麼要使用它?
    SSL stripping 是一種攻擊者強迫瀏覽器使用 HTTP 協議連接到站點的技術,這樣他們就可以嗅探數據包,攔截或修改敏感信息。另外,HSTS 也是一個很好的保護自己免受 cookie 劫持(cookie hijacking)的方法。
  • 在 Ubuntu 16.04 為 Nginx 伺服器安裝 LEMP 環境(MariaDB,PHP 7 並支持 HTTP 2.0)
    ),它被用來搭建動態的網絡應用和網頁。5、 當你按照以上步驟編輯完 Nginx 的默認配置文件之後,用下面這些命令來生成、查看 SSL 證書和密鑰。用你自定義的設置完成證書的製作,注意 Common Name 設置成和你的 DNS FQDN 記錄或者伺服器 IP 地址相匹配。
  • HTTP協議原理
    這篇文章我們就先來了解一下HTTP協議原理。1、HTTP簡介HTTP是一個屬於應用層的面向對象的協議,由於其簡捷、快速的方式,適用於分布式超媒體信息系統。它於1990年提出,經過幾年的使用與發展,得到不斷地完善和擴展。HTTP協議的主要特點1、支持C/S(客戶/伺服器)模式。
  • Ingress-nginx工作原理和實踐
    Ingress vs Ingress-nginxIngress 是一種向 k8s 集群外部的客戶端公開服務的方法, Ingress 在網絡協議棧的應用層工作,根據請求的主機名 host 和路徑 path 決定請求轉發到的服務。
  • HSTS 詳解,讓 HTTPS 更安全
    與此同時,由於用戶對網絡安全的不了解和一些網站、協議的安全漏洞,讓很多用戶的個人信息數據「裸露」在網際網路中。為此谷歌在 Chrome 68 版本後,其界面將會讓使用者更容易了解 HTTP 網頁是不安全的,並持續推動網站預設使用 HTTPS。但 HTTP 依舊可以訪問使用,為此一些網站可以設置 HSTS 策略,以此來強制瀏覽器使用 HTTPS 與網站通信,來保障網站更加安全。
  • 如何使用nginxWebUI圖形化gui界面管理nginx
    功能特點nginxWebUI是一款圖形化管理nginx配置得工具, 可以使用網頁來快速配置nginx的各項功能, 包括http協議轉發, tcp協議轉發, 反向代理, 負載均衡, 靜態html伺服器, ssl證書自動申請、續籤、配置等, 最終生成nginx.conf文件並覆蓋nginx
  • Linux 平臺通過 nginx 和 vsftpd 構建圖片伺服器
    其將原始碼以類 BSD 許可證的形式發布,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。這篇文章主要介紹了 Linux 平臺通過 nginx 和 vsftpd 構建圖片伺服器, 需要的朋友可以參考下因為開發需要,需要在 Linux 上構建一個獨立的圖片伺服器,此處默認您已安裝好 Linux 系統。
  • nginx+nginx-rtmp-module+ffmpeg搭建流媒體伺服器伺服器
    nginx的文章是有一定的道理的,過段時間我會寫一些協議棧的學習總結分享:nginx之靜態資源訪問和負載均衡的使用!的readme,裡面有比較詳細的介紹其它的配置,並且它還提供了一個通過JWPlayer在網頁上播放的例子:保存完配置文件後,啟動nginx,通過netstat -ltn命令可以看到增加了一個1935埠的監聽.8080是nginx默認的http監聽埠。