Host: 是否需要 SSL 標頭?
即使請求不是 HTTP/1.1,主機是否也需要 SSL 標頭?
因此,如果客戶端通過 SSL 連接,並發送以下請求:
GET / HTTP/1.0
- Web 伺服器是否應該由於缺少 Host: 標頭而引發錯誤請求?
- Web 伺服器是否應該使用 HTTP/1.0 200 OK 響應來響應?( index.html 文件始終存在,因此對/
的請求永遠不會導致 403/404)
更新:
如果我在 中禁用 SNI
openssl s_client
,則 apache 將在沒有 Host: 標頭的情況下工作。為什麼在 SNI 開啟時需要 Host: 標頭?
根據標準,HTTP/1.0 請求不需要主機,但在實踐中通常仍需要此標頭來決定要提供哪些內容的多域設置。但是,如果此標頭不存在並且仍然清楚要提供哪些內容,則可以在不需要標頭的情況下提供此內容。請注意,這與 TLS 和使用 SNI 無關。
要回答更新中添加的部分問題,
為什麼在 SNI 開啟時需要 Host: 標頭?
“需要”是一個強詞,但它有助於理解 SNI 和 HTTP 標頭在兩個不同的層上執行,因此服務於兩個不同的目的。
SNI主要用於確定向客戶端提供哪個證書。在具有多個虛擬主機的設置中,在解密有效負載之前,伺服器必須向客戶端提供證書。由於證書包含站點的名稱,傳統上是證書主題的通用名稱,但最近在 X.509 擴展主題替代名稱中,提供錯誤的證書會導致客戶端在發送 HTTP 請求之前拒絕連接到伺服器。
而
Host
標頭主要用於確定要服務的資源。在表現良好的客戶端中,這與 SNI 中的名稱是多餘的,但 HTTP/1.1 與SSL 3.0幾乎同時開發,因此甚至早於 TLS-SNI 擴展存在。事實上,正是 HTTP/1.1 和 SSL/TLS 的結合才發現了對 SNI 的需求。值得注意的是,HTTP/2不需要標
Host
頭,但具有:authority
偽標頭形式的功能等效項。儘管在大多數情況下,該標頭中的資訊對於 TLS-SNI 仍然是冗餘的,但它簡化了實現以始終包含它。始終包含
Host
(or:authority
) 標頭也留下了準系統 SSL 終止的可能性(儘管實際上很少支持沒有 TLS 的 HTTP/2)。但是,不驗證主機/權限是否與 TLS-SNI 中的名稱匹配可能會在某些設置中打開安全漏洞。