HTTP 协议安全

1. 前言

上节我们讨论了 HTTP 请求中,如何通过配置其头部参数达到安全性提升的效果,本节将讨论 HTTP 协议层面的安全性提升方法。

HTTP 通讯协议是一种明文传输协议,存在安全隐患,所以通常我们会使用 TLS 方式保障其安全。

本节我们主要讨论 Spring Security 中的 HTTP 安全。

2. 关于 TLS

2.1 TLS 基本概念

TLS 是指传输层安全(Transport Layer Security)。

TLS 的作用包括:

  • 机密性。保护消息的内容不被攻击者获取。
  • 完整性。保护消息不被攻击者篡改,是真实可靠的。
  • 防重放。保护消息不被攻击者截获并再次发送。
  • 身份识别。允许客户端验证服务器的可靠性(注意客户端的真实性只有在客户端认证开启时才进行)。

TLS 同样也被很多其他协议用于保护机密性和完整性,并且有多种用法。我们在这里主要关注的是基于 HTTP 协议的 B/S 应用,将它升级为 HTTPS。

2.2 SSL 和 TLS 的关系

我们常常听到 HTTP + SSL = HTTPS 这样的观念,那 SSL 和 TLS 有什么关系呢?

SSL 的全称是 Secure Socket Layer,安全套接字层。SSL 最初用于 HTTP 加密传输,也就是 HTTPS 的早期形态,后来出现了 SSL v2 和 SSL v3,不过这两个版本都有些瑕疵,于是出现了SSL v3.1,SSL v3.1 后该协议被重命名为 TLS,并从 1.0 从新编排版本,再往后出现了 v1.1、v1.2 和 v1.3。

所以,从某种意义上讲 SSL、SSL/TLS、TLS 这三种写法的含义是相同的,我们多数情况还是把 HTTP 的安全框架称为 SSL。

3. TLS 的应用

Spring Security 作为一种安全框架,本身并不处理是否使用 HTTP 方式连接,也就是说它不能直接建立 HTTPS 连接。但是它提供了一系列方法,使我们的 HTTPS 操作更加遍历。

3.1 重定向到 HTTPS

当客户端使用 HTTP 向服务端发送请求时,Spring Security 可以将请求自动转换为 HTTPS 的连接方式。

例如,如下代码强制所有 HTTP 请求重定向为 HTTPS 请求:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) {
        http.requiresChannel(channel -> channel.anyRequest().requiresSecure());
    }
}

3.2 强制安全传输

Spring Security 提供了对强制安全传输的支持,并且其在默认情况下是开启的。此部分在 HTTP 安全响应头中也有过介绍。

例如,当我们访问某个银行网站「mybank.example.com」,当我们使用 https 方式访问时,便避免了出现中间人攻击。在开启强制安全传输的情况下,浏览器将所有将要发送到服务端的请求都强制为 https 协议。

此功能默认被开启,如果需要修改它的默认配置,可通过如下方式进行配置:

@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) // 增加到浏览器内置的 HTTPS 列表
                    .maxAgeInSeconds(31536000) // 强制期限
                )
            );
    }
}

4. 小结

本节讨论了通过 HTTP + SSL 的方式,规避 HTTP 协议在安全上的不足。

图片描述

  • HTTP 协议存在安全隐患,容易遭到恶意攻击,例如中间人攻击;
  • HTTP 安全时传输层安全的范畴,可以通过重定向 HTTP 连接和强制安全传输的方式增加其安全性;
  • Spring Security 支持通过配置将 HTTP 请求转换为 HTTPS 请求;
  • Spring Security 支持为 B/S 应用强制使用安全传输。

下节我们讨论如果通过 Spring Security 统一不同 Web 容器间的访问控制差异。