HTTP 協(xié)議安全
1. 前言
上節(jié)我們討論了 HTTP 請(qǐng)求中,如何通過(guò)配置其頭部參數(shù)達(dá)到安全性提升的效果,本節(jié)將討論 HTTP 協(xié)議層面的安全性提升方法。
HTTP 通訊協(xié)議是一種明文傳輸協(xié)議,存在安全隱患,所以通常我們會(huì)使用 TLS 方式保障其安全。
本節(jié)我們主要討論 Spring Security 中的 HTTP 安全。
2. 關(guān)于 TLS
2.1 TLS 基本概念
TLS 是指?jìng)鬏攲影踩═ransport Layer Security)。
TLS 的作用包括:
- 機(jī)密性。保護(hù)消息的內(nèi)容不被攻擊者獲取。
- 完整性。保護(hù)消息不被攻擊者篡改,是真實(shí)可靠的。
- 防重放。保護(hù)消息不被攻擊者截獲并再次發(fā)送。
- 身份識(shí)別。允許客戶(hù)端驗(yàn)證服務(wù)器的可靠性(注意客戶(hù)端的真實(shí)性只有在客戶(hù)端認(rèn)證開(kāi)啟時(shí)才進(jìn)行)。
TLS 同樣也被很多其他協(xié)議用于保護(hù)機(jī)密性和完整性,并且有多種用法。我們?cè)谶@里主要關(guān)注的是基于 HTTP 協(xié)議的 B/S 應(yīng)用,將它升級(jí)為 HTTPS。
2.2 SSL 和 TLS 的關(guān)系
我們常常聽(tīng)到 HTTP + SSL = HTTPS 這樣的觀念,那 SSL 和 TLS 有什么關(guān)系呢?
SSL 的全稱(chēng)是 Secure Socket Layer,安全套接字層。SSL 最初用于 HTTP 加密傳輸,也就是 HTTPS 的早期形態(tài),后來(lái)出現(xiàn)了 SSL v2 和 SSL v3,不過(guò)這兩個(gè)版本都有些瑕疵,于是出現(xiàn)了SSL v3.1,SSL v3.1 后該協(xié)議被重命名為 TLS,并從 1.0 從新編排版本,再往后出現(xiàn)了 v1.1、v1.2 和 v1.3。
所以,從某種意義上講 SSL、SSL/TLS、TLS 這三種寫(xiě)法的含義是相同的,我們多數(shù)情況還是把 HTTP 的安全框架稱(chēng)為 SSL。
3. TLS 的應(yīng)用
Spring Security 作為一種安全框架,本身并不處理是否使用 HTTP 方式連接,也就是說(shuō)它不能直接建立 HTTPS 連接。但是它提供了一系列方法,使我們的 HTTPS 操作更加遍歷。
3.1 重定向到 HTTPS
當(dāng)客戶(hù)端使用 HTTP 向服務(wù)端發(fā)送請(qǐng)求時(shí),Spring Security 可以將請(qǐng)求自動(dòng)轉(zhuǎn)換為 HTTPS 的連接方式。
例如,如下代碼強(qiáng)制所有 HTTP 請(qǐng)求重定向?yàn)?HTTPS 請(qǐng)求:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) {
http.requiresChannel(channel -> channel.anyRequest().requiresSecure());
}
}
3.2 強(qiáng)制安全傳輸
Spring Security 提供了對(duì)強(qiáng)制安全傳輸?shù)闹С?,并且其在默認(rèn)情況下是開(kāi)啟的。此部分在 HTTP 安全響應(yīng)頭中也有過(guò)介紹。
例如,當(dāng)我們?cè)L問(wèn)某個(gè)銀行網(wǎng)站「mybank.example.com」,當(dāng)我們使用 https 方式訪(fǎng)問(wèn)時(shí),便避免了出現(xiàn)中間人攻擊。在開(kāi)啟強(qiáng)制安全傳輸?shù)那闆r下,瀏覽器將所有將要發(fā)送到服務(wù)端的請(qǐng)求都強(qiáng)制為 https 協(xié)議。
此功能默認(rèn)被開(kāi)啟,如果需要修改它的默認(rèn)配置,可通過(guò)如下方式進(jìn)行配置:
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
// ...
.headers(headers -> headers
.httpStrictTransportSecurity(hsts -> hsts
.includeSubDomains(true) // 包含子域名
.preload(true) // 增加到瀏覽器內(nèi)置的 HTTPS 列表
.maxAgeInSeconds(31536000) // 強(qiáng)制期限
)
);
}
}
4. 小結(jié)
本節(jié)討論了通過(guò) HTTP + SSL 的方式,規(guī)避 HTTP 協(xié)議在安全上的不足。
- HTTP 協(xié)議存在安全隱患,容易遭到惡意攻擊,例如中間人攻擊;
- HTTP 安全時(shí)傳輸層安全的范疇,可以通過(guò)重定向 HTTP 連接和強(qiáng)制安全傳輸?shù)姆绞皆黾悠浒踩裕?/li>
- Spring Security 支持通過(guò)配置將 HTTP 請(qǐng)求轉(zhuǎn)換為 HTTPS 請(qǐng)求;
- Spring Security 支持為 B/S 應(yīng)用強(qiáng)制使用安全傳輸。
下節(jié)我們討論如果通過(guò) Spring Security 統(tǒng)一不同 Web 容器間的訪(fǎng)問(wèn)控制差異。