TLS 与网络安全
约 1980 字大约 7 分钟
TLSSSLHTTPS网络安全
2026-04-16
TLS 简介
TLS(Transport Layer Security,传输层安全)是一种加密协议,用于在两个通信应用程序之间提供数据保密性和完整性保证。
SSL 与 TLS 的区别
SSL(Secure Sockets Layer,安全套接字层)是 TLS 的前身,由 Netscape 公司开发。
| 版本 | 状态 | 说明 |
|---|---|---|
| SSL 1.0 | 从未公开发布 | 存在严重安全漏洞 |
| SSL 2.0 | 已废弃 | 1994 年发布,存在多个漏洞 |
| SSL 3.0 | 已废弃 | 1995 年发布,POODLE 攻击可破解 |
| TLS 1.0 | 已废弃 | 1999 年发布,兼容 SSL 3.0 |
| TLS 1.1 | 已废弃 | 2006 年发布,添加 IV 保护 |
| TLS 1.2 | 广泛使用 | 2008 年发布,支持 AEAD 加密 |
| TLS 1.3 | 推荐使用 | 2018 年发布,更快更安全 |
TLS 1.0 和 1.1 已于 2020 年被浏览器废弃,现在主流版本是 TLS 1.2 和 TLS 1.3。
HTTPS 的必要性
HTTP 是明文传输,存在以下风险:
- 窃听风险:第三方可以截获并读取通信内容
- 篡改风险:第三方可以修改通信内容
- 冒充风险:第三方可以冒充服务端或客户端
HTTPS 通过 TLS 加密传输数据,有效解决上述安全问题。
TLS 握手过程
对称加密 vs 非对称加密
对称加密
- 使用相同的密钥进行加密和解密
- 速度快,适合加密大量数据
- 常见算法:AES、ChaCha20
非对称加密
- 使用公钥加密、私钥解密(或反过来)
- 速度慢,但解决了密钥分发问题
- 常见算法:RSA、ECDSA、Ed25519
TLS 握手结合两者:使用非对称加密交换密钥,后续通信使用对称加密。
RSA 密钥交换
TLS 1.2 中经典的 RSA 密钥交换流程:
客户端 ──── Client Hello ────▶ 服务端
客户端 ◀─── Server Hello ──── 服务端
客户端 ◀─── 证书 + ServerKeyExchange ── 服务端
客户端 ◀─── ServerHelloDone ── 服务端
客户端 ──── PreMasterSecret ──▶ 服务端(用公钥加密)
客户端 ──── ChangeCipherSpec ──▶ 服务端
客户端 ──── Finished ────▶ 服务端
客户端 ◀─── ChangeCipherSpec ── 服务端
客户端 ◀─── Finished ──── 服务端
加密通信开始问题:如果服务端私钥泄露,攻击者可以解密所有之前的通信(前向保密性差)。
ECDHE 密钥交换
ECDHE(Elliptic Curve Diffie-Hellman Ephemeral)提供前向保密性:
客户端 ──── Client Hello ────▶ 服务端
客户端 ◀─── Server Hello ──── 服务端
客户端 ◀─── 证书 + ServerECDHParams ── 服务端
客户端 ◀─── ServerHelloDone ── 服务端
客户端 ──── ECDH ClientKeyExchange ──▶ 服务端
(双方计算得到相同的预主密钥)
客户端 ──── ChangeCipherSpec ──▶ 服务端
客户端 ──── Finished ────▶ 服务端
客户端 ◀─── ChangeCipherSpec ── 服务端
客户端 ◀─── Finished ──── 服务端
加密通信开始优势:
- 每次会话使用临时密钥
- 即使长期私钥泄露,之前会话的通信仍然安全
证书与证书链
TLS 证书采用 PKI(公钥基础设施)体系:
浏览器根证书库
└── 根证书颁发机构 (Root CA)
└── 中间证书颁发机构 (Intermediate CA)
└── 服务器证书 (Server Certificate)证书类型:
- 根证书(Root Certificate):CA 机构的自签名证书,预装在操作系统和浏览器中
- 中间证书(Intermediate Certificate):由根 CA 签发,用于签发终端实体证书
- 服务器证书(Server Certificate):由中间 CA 签发,包含服务器公钥和域名
验证流程:
- 浏览器获取服务器证书
- 检查证书域名是否匹配
- 检查证书是否在有效期内
- 通过证书链逐级向上验证,直到根证书
- 检查根证书是否在信任列表中
TLS 1.2 vs TLS 1.3
TLS 1.3 在安全性和性能上有显著提升:
| 特性 | TLS 1.2 | TLS 1.3 |
|---|---|---|
| 握手往返次数 | 2-RTT | 1-RTT |
| 0-RTT 恢复 | 不支持 | 支持 |
| RSA 密钥交换 | 支持 | 移除 |
| 静态 RSA 密钥交换 | 支持 | 移除 |
| CBC 模式加密 | 支持 | 移除 |
| RC4 加密 | 支持 | 移除 |
| SHA-1 证书 | 支持 | 移除 |
| 前向保密 | 可选 | 必须 |
| 密钥派生函数 | MD5/SHA-1/SHA-256 | HKDF |
TLS 1.3 握手过程:
客户端 ──── Client Hello + 支持的密码套件 ────▶ 服务端
客户端 ◀─── Server Hello + 证书 + Finished ──── 服务端
客户端 ──── Finished ────▶ 服务端
加密通信开始(1-RTT)HTTP 安全问题
中间人攻击(MITM)
攻击者位于客户端和服务端之间,拦截并可能修改通信内容。
攻击场景:
- 攻击者诱骗用户连接到自己控制的热点
- 用户发起 HTTP 请求,攻击者截获
- 攻击者代替用户向服务端发起请求
- 服务端响应后,攻击者将响应转发给用户
防御:使用 HTTPS,确保证书验证。
数据篡改
攻击者修改传输中的数据,如:
- 修改网页内容,注入恶意代码
- 修改 API 响应数据
- 篡改金融交易金额
防御:TLS 完整性校验,MAC(Message Authentication Code)确保数据不被篡改。
会话劫持
攻击者窃取用户的会话 ID,以受害者身份发起请求。
常见手段:
- 网络嗅探(HTTP 会话)
- XSS 攻击获取 Cookie
- 中间人攻击截获会话
防御措施:
- 使用 HTTPS
- HttpOnly Cookie
- Session 定期过期
- 敏感操作二次验证
HTTPS 的配置与优化
证书选择
证书颁发机构(CA)类型:
| 类型 | 验证级别 | 颁发速度 | 价格 | 适用场景 |
|---|---|---|---|---|
| DV(域名验证) | 仅验证域名所有权 | 快(分钟级) | 低/免费 | 个人站点、小型网站 |
| OV(组织验证) | 验证域名+组织身份 | 中(1-3天) | 中 | 企业官网、电商 |
| EV(扩展验证) | 严格验证组织身份 | 慢(3-7天) | 高 | 金融、银行、电商 |
主流 CA 机构:
- Let's Encrypt:免费、自动化,支持 ACME 协议
- DigiCert:高端证书,EV 证书首选
- GlobalSign:企业级证书,老牌 CA
# 使用 acme.sh 申请 Let's Encrypt 证书
acme.sh --issue -d example.com -d www.example.com --nginxTLS 配置最佳实践
服务端配置示例(Nginx):
server {
listen 443 ssl http2;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
ssl_trusted_certificate /path/to/chain.pem;
# TLS 版本控制
ssl_protocols TLSv1.2 TLSv1.3;
# 密码套件配置
ssl_ciphers TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256;
ssl_prefer_server_ciphers off;
# 椭圆曲线
ssl_ecdh_curve secp384r1;
# OCSP 装订
ssl_stapling on;
ssl_stapling_verify on;
# 会话缓存
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
}推荐密码套件:
- TLS 1.3:
TLS_AES_256_GCM_SHA384、TLS_CHACHA20_POLY1305_SHA256 - TLS 1.2:
ECDHE-ECDSA-AES256-GCM-SHA384、ECDHE-RSA-AES256-GCM-SHA384
HSTS
HSTS(HTTP Strict Transport Security)强制浏览器使用 HTTPS 连接。
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;参数说明:
max-age:HSTS 策略生效时间(秒)includeSubDomains:子域名也强制 HTTPSpreload:申请加入浏览器预加载列表
Preload List:
提交到 hstspreload.org 后,浏览器会内置该域名必须使用 HTTPS。
前端安全注意
HTTPS Only
- 站点全面启用 HTTPS
- 301 重定向 HTTP 到 HTTPS
- 混合内容(Mixed Content)问题
<!-- 强制使用 HTTPS -->
<meta http-equiv="Strict-Transport-Security" content="max-age=31536000">解决混合内容问题:
- 使用 HTTPS 加载所有资源
- CDN 资源使用 HTTPS
- 第三方脚本确保支持 HTTPS
CSP(内容安全策略)
CSP 用于防止 XSS 攻击,限制页面可以加载的资源来源。
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' 'unsafe-inline' https://cdn.example.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:;">常见指令:
| 指令 | 说明 |
|---|---|
| default-src | 默认资源来源 |
| script-src | JavaScript 来源 |
| style-src | CSS 来源 |
| img-src | 图片来源 |
| connect-src | AJAX、WebSocket 来源 |
| frame-src | iframe 来源 |
安全 Headers
常用安全响应头:
# 防止 XSS
add_header X-XSS-Protection "1; mode=block";
# 防止点击劫持
add_header X-Frame-Options "DENY";
# 内容类型 sniffing 防护
add_header X-Content-Type-Options "nosniff";
# 引用来源策略
add_header Referrer-Policy "strict-origin-when-cross-origin";
# 权限策略
add_header Permissions-Policy "geolocation=(), camera=(), microphone=()";完整配置示例:
add_header X-Frame-Options "DENY" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;