大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
SSL/TLS
用户与 API 之间的流量在公网是 明文可见 的——中间人可窃听、篡改 Cookie 与 Token。TLS(Transport Layer Security) 在 TCP 之上提供 机密性 + 完整性 + 服务端身份,对外常统称 HTTPS。后端工程师至少要会:证书链如何建立信任、Spring Boot 如何配 HTTPS、哪些场景必须强制 TLS。
学习目标
- 解释证书、公钥、证书链与「浏览器为何信任某站点」
- 配置 Spring Boot 或反向代理终止 TLS 的基本思路
- 与 http-https 衔接,理解握手在 HTTP 层之下发生
TLS 解决什么问题
| 能力 | 没有 TLS | 有 TLS |
|---|---|---|
| 窃听 | 密码、JWT 可被嗅探 | 信道加密 |
| 篡改 | 响应可被替换 | 完整性校验 |
| 冒充 | 连到假服务器 | 证书绑定域名 |
TLS 不解决:应用层 XSS、越权、弱密码——那些靠 sec-owasp 与业务逻辑。
证书链直觉
根 CA(内置在 OS/浏览器)
→ 中间 CA
→ 站点证书(含域名、公钥、有效期)
客户端校验:域名匹配、未过期、链签名有效。自签证书在 开发环境 可用,生产应对公网用户使用 公开 CA(Let's Encrypt、云厂商 ACM 等)。
两种常见部署模式
1. 反向代理终止 TLS(推荐生产)
Client --HTTPS--> Nginx / ALB --HTTP--> Spring Boot :8080
- 证书在 Nginx / 云负载均衡 上更新
- Spring 关注业务;注意配置
X-Forwarded-Proto以便生成正确跳转 URL - 内网段 HTTP 可接受,但 内网也应分区,防横向移动
2. Spring Boot 直接 HTTPS
# application-prod.yml 示例
server:
port: 8443
ssl:
enabled: true
key-store: classpath:keystore.p12
key-store-password: ${SSL_KEYSTORE_PASSWORD}
key-store-type: PKCS12
密钥密码 必须 来自环境变量,keystore 文件 不进 Git。
必须 HTTPS 的场景
- Basic 认证(Base64 非加密,仅编码)
- Cookie 会话 带
Secure时 - OAuth redirect 与 token 端点(见 oauth-flows)
- 任何 登录、支付、PII 接口
开发本地可用 http://localhost,但 集成测试环境起就应 mimic 生产 的 HTTPS 行为,避免「本地 OK、上线 Cookie 失效」。
常见配置错误
| 错误 | 后果 |
|---|---|
| 混合内容:HTTPS 页加载 HTTP 脚本 | 被降级攻击 |
| 证书域名与 API 域名不一致 | 客户端拒绝连接 |
| 禁用证书校验「临时调试」进生产 | 中间人畅通无阻 |
| TLS 1.0 / 弱 cipher 未关 | 可被降级破解 |
现代服务器默认应 TLS 1.2+,并跟随 Mozilla SSL Configuration Generator 或云厂商最佳实践。
HSTS(可选强化)
响应头:
Strict-Transport-Security: max-age=31536000; includeSubDomains
告诉浏览器 在有效期内只走 HTTPS。首次访问仍可能遭降级,通常与 全站 HTTPS + 301 跳转 一起上。
与 Spring Security 的关系
sb-security 可配置 requiresChannel().anyRequest().requiresSecure() 强制 HTTPS。若 TLS 在 Nginx 终止,需正确识别 X-Forwarded-Proto,否则可能 无限重定向 或 误判为 HTTP。
练习
- 用浏览器 DevTools → Security 面板查看任意 HTTPS 站的证书链
- 阅读 http-https,对比「握手步骤」与本文「证书链」描述
- 列出你项目:TLS 在哪一层终止?密钥存在哪、谁轮换?
小结
公网 API 默认 HTTPS;证书在边界或 Boot 正确挂载;Basic 与 Cookie 无 TLS 等于裸奔。 下一课讲浏览器同源与 CORS——应用层跨域控制。