楼层: 首页/ 软件技术/ 中间件全景/ 安全中间件:WAF 与 TLS/SSL
08

安全中间件:WAF 与 TLS/SSL

Security Middleware · WAF / TLS

安全中间件就是门口的安检。WAF 拦 SQL 注入、XSS、CSRF 这些恶意请求;TLS 给通信加密,让窃听者看到的是乱码。你的网站没上 HTTPS,浏览器直接标"不安全";没 WAF,分分钟被人拖库。

7.1 WAF:Web 应用防火墙

论WAF 干什么

检测和拦截 HTTP/HTTPS 恶意请求,防护 SQL 注入/XSS/CSRF/文件包含/命令注入等 Web 攻击。它工作在应用层(第七层),懂 HTTP 协议内容,不像防火墙只看 IP/端口。OWASP Top 10 里的常见攻击它都能拦。

工作模式三种:① 透明代理(反向代理模式):流量经过 WAF 再到后端,最常用;② 镜像模式:只检测不拦截,适合观察;③ 路由模式:接在网络边界。

7.2 开源 WAF:ModSecurity + Nginx

最经典的开源 WAF 组合:Nginx + ModSecurity 模块 + OWASP CRS(核心规则集)。ModSecurity 是引擎,CRS 是现成的规则库,覆盖 OWASP Top 10。

# Nginx 开启 ModSecurity load_module modules/ngx_http_modsecurity_module.so; server { listen 443 ssl; modsecurity on; modsecurity_rules_file /etc/nginx/modsec/main.conf; location / { proxy_pass http://tomcat_backend; } } # main.conf 加载 OWASP CRS 规则 Include /etc/nginx/modsec/owasp-crs/*.conf
WAF 选型对比
方案特点适合
ModSecurity + CRS开源免费,规则可定制中小团队、自建
云 WAF(阿里云/腾讯云)开箱即用,规则云更新云上业务,省事
Cloudflare WAF全球 CDN + WAF,DDoS 防护出海业务
商业硬件 WAF性能强,规则丰富,贵金融、大型企业

7.3 TLS/SSL 加密:HTTPS 的底层

论TLS 是什么

传输层安全协议,HTTPS 的底层,加密通信 + 身份验证 + 数据完整性。SSL 是老名字(已废弃),现在用的是 TLS 1.2 / TLS 1.3。它保证三件事:① 加密——窃听者看到的是密文;② 身份验证——通过证书确认对方是真网站不是钓鱼;③ 完整性——数据传输中被篡改能发现。

7.4 TLS 握手过程

Client Hello
客户端说:我支持这些加密套件,这是我的随机数
→
Server Hello + 证书
服务端选一个套件,发证书,给服务端随机数
验证证书 + 密钥交换
客户端验证证书合法,生成 pre-master secret 加密发给服务端
→
Finished 加密通信
双方算出会话密钥,后续全加密

TLS 1.3 比 1.2 快很多:1.2 要 2 个 RTT,1.3 只要 1 个 RTT。而且 1.3 废弃了不安全的加密套件,默认前向保密(PFS)。新项目直接上 TLS 1.3。

7.5 证书申请与 Nginx HTTPS

Let's Encrypt 提供免费 DV 证书,certbot 自动申请和续期。

# 用 certbot 申请证书(自动改 Nginx 配置) sudo certbot --nginx -d www.example.com # certbot 自动写进 Nginx 的配置: server { listen 443 ssl http2; server_name www.example.com; ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # HSTS:浏览器记住"以后只走 HTTPS" add_header Strict-Transport-Security "max-age=31536000" always; } # 自动续期(certbot 会装 systemd timer) sudo certbot renew --dry-run
证书类型对比
类型验证级别浏览器显示价格
DV只验证域名所有权小锁图标免费(Let's Encrypt)
OV验证域名 + 企业身份小锁 + 企业名几百-几千/年
EV严格验证企业地址栏显示企业名几千/年

7.6 身份认证:OAuth2 与 JWT(你是谁、能干嘛)

引子:HTTPS 解决了"通信不被窃听篡改",但没解决"对面这个人到底是谁"。你登录一个 App,后面每次请求怎么知道是你?这就是身份认证中间件干的活。两个面试高频词:OAuth2(第三方登录的授权协议)和 JWT(一种自包含的令牌格式)。

你(用户)
想登录 App A
→
"用微信登录"
跳到微信授权页
→
微信发 code
App A 拿 code 换 access_token
→
A 拿到你的昵称头像
登录成功,不碰你的微信密码

论OAuth2 和 JWT 不是一回事

OAuth2 是一套"授权框架",解决"App A 想访问你在微信上的资料,但不该让 A 知道你的微信密码"。它定义四种角色(资源所有者=你、客户端=App A、授权服务器=微信、资源服务器=微信的用户信息接口)和四种授权模式,最常用的就是上面那个"授权码模式"(扫码登录)。

JWT(JSON Web Token)是一种"令牌的格式",不是协议。它是一串 头部.载荷.签名 用点连起来的字符串,载荷里自带用户 ID、过期时间等信息,后端不用查 Session 存的东西,拿公钥验签就知道你是谁。无状态,分布式系统最爱。OAuth2 拿到的 access_token 经常就是个 JWT。

JWT 长什么样、怎么验签

# 一个 JWT 由三段用点拼起来:header.payload.signature eyJhbGciOiJIUzI1NiJ9.ewogICJ1c2VySWQiOiIxMDAxIiwKICJleHAiOjE3MjAwMDAwMDAKfQ.signature... # header:声明用什么算法(HS256) # payload:放用户信息(注意:base64 编码不是加密!别放密码) # signature:用服务端私钥对前两段签名,防篡改 # Spring Security 里生成一个 JWT 的核心(伪代码) String token = Jwts.builder() .setSubject("1001") # 用户 ID .setExpiration(new Date(System.currentTimeMillis() + 86400000)) # 24 小时过期 .signWith(SignatureAlgorithm.HS256, secretKey) # 私钥签名 .compact(); # 前端下次请求带上:Authorization: Bearer <token> # 后端拦截器拿公钥验签 + 看过期时间,通过就放行
JWT 三个必踩的坑

① 别在 payload 放敏感信息。JWT 只是 base64 编码,谁都能解开看,放密码等于明文贴大街。② JWT 发出去就"收不回"。它无状态,后端不存 Session,用户登出了服务端很难立刻让旧 token 失效(要加黑名单/短过期)。③ 密钥别硬编码进前端。签名密钥只放服务端,泄露了等于谁都能伪造你的身份。

选型:单体小系统用 Session 就够;前后端分离、多端、要第三方登录(微信/支付宝/扫码),就上 JWT + OAuth2。

记
第七章小结

① WAF 是应用层安检,开源用 Nginx+ModSecurity+CRS,省事用云 WAF。

② TLS 1.3 是当前标准,握手快、前向保密。证书用 Let's Encrypt 免费申请,certbot 自动续期。

③ HTTPS 三件套:证书 + ssl_protocols TLSv1.2/1.3 + HSTS。

④ 身份认证:OAuth2 管第三方授权(扫码登录),JWT 是自包含令牌格式,无状态分布式最爱;payload 别放敏感信息。