隨記(四):簡述HSTS協議

XXR_Beta發表於2020-11-30

HSTS協議概要

HSTS意為嚴格傳輸安全協議(英語:HTTP Strict Transport Security),其最為核心的是一個HTTP響應頭(HTTP Response Header),正如圖所示:

在這裡插入圖片描述
HSTS Header的語法如下:

Strict-Transport-Security: max-age=XXX; includeSubDomains; preload
  • max-age是必填引數,是一個以秒為單位的數值,它代表著HSTS響應頭的過期時間,通常設定為一年,即31536000秒。
  • includeSubDomains是可選引數,如果包含它,則意味著當前域名及其子域名均開啟HSTS保護。
  • preload是可選引數,只有當你申請將自己的域名加入到瀏覽器內建列表時,才需要使用到它。

(Tips:在生產環境下使用HSTS機制時,建議先將max-age引數的值設定小一些(如:若干分鐘),檢查HSTS是否能正常工作,網站能否正常訪問,然後再逐步將時間延長(如:一週/一個月),並在這個時間範圍內繼續檢查HSTS是否正常工作,最後才改到一年。這是因為當網站證書有問題時,一旦瀏覽器接收到HSTS Header ,那麼使用者將在有HSTS效期間內,直到證書錯誤被修復,或者使用者主動清除瀏覽器快取為止,都無法訪問到你的網站。)

HSTS作用

HSTS的作用是強制客戶端(如:瀏覽器)使用HTTPS與伺服器建立連線,使用者無需手動在URL位址列中輸入HTTPS,瀏覽器始終保持HTTPS連結訪問網頁。
使用HSTS可以做到讓瀏覽器強制拒絕不安全的連結,不給使用者選擇的機會。

在沒有HSTS保護的情況下,當瀏覽器發現當前網站的證書出現錯誤,或者瀏覽器和伺服器之間的通訊不安全,無法建立HTTPS連線的時候,瀏覽器通常會警告使用者,但是卻又允許使用者繼續不安全的訪問。而有了HSTS後,瀏覽器將會徹底阻止使用者繼續訪問。

在這裡插入圖片描述

HSTS配置方法

  • Nginx伺服器 - 配置
## 在config.conf配置檔案中新增以下指令
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
  • Apache伺服器 - 配置
  1. 在httpd.conf檔案中載入headers模組:
LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so
  1. 在VirtualHost 0.0.0.0:443中新增下面程式碼行:
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
  1. 重啟Apache伺服器。
  • IIS伺服器 - 配置
    在web.config檔案中新增下列命令列進行配置:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
    <rewrite>
        <rules>
            <rule name="HTTP to HTTPS redirect" stopProcessing="true">
                <match url="(.*)" />
                <conditions>
                    <add input="{HTTPS}" pattern="off" ignoreCase="true" />
                </conditions>
                <action type="Redirect" url="https://{HTTP_HOST}/{R:1}"
                    redirectType="Permanent" />
            </rule>
        </rules>
        <outboundRules>
            <rule name="Add Strict-Transport-Security when HTTPS" enabled="true">
                <match serverVariable="RESPONSE_Strict_Transport_Security"
                    pattern=".*" />
                <conditions>
                    <add input="{HTTPS}" pattern="on" ignoreCase="true" />
                </conditions>
                <action type="Rewrite" value="max-age=31536000" />
            </rule>
        </outboundRules>
    </rewrite>
</system.webServer>
</configuration>

相關文章