HTTPS 与 TLS 原理
TLS 握手过程
1.2 完整握手(4 次往返)
Client Server
|-------- ClientHello -------->| ① 客户端随机数 + 支持的加密套件
|<---- ServerHello ------------| ② 服务端随机数 + 选定套件
|<---- Certificate ------------| ③ 服务端证书链
|<---- ServerHelloDone --------| ④ 握手完成
|-------- ClientKeyExchange -->| ⑤ 客户端生成 PreMaster Secret,用公钥加密发送
|-------- ChangeCipherSpec --->| ⑥ 切换对称加密
|-------- Finished ----------->| ⑦ 握手消息 HMAC
|<---- ChangeCipherSpec -------| ⑧ 服务端切换
|<---- Finished ---------------| ⑨ 握手完成
|=========== 加密通信 ==========>|1.3 1-RTT 握手
Client Server
|-------- ClientHello -------->| + key_share(客户端 DH 参数)
|<---- ServerHello ------------| + key_share(服务端 DH 参数)
|<---- EncryptedExtensions ----|
|<---- Certificate ------------|
|<---- CertificateVerify ------|
|<---- Finished ---------------|
|-------- Finished ----------->|
|=========== 加密通信 ==========>|TLS 1.3 将握手从 2-RTT 降到 1-RTT,且移除了不安全的加密套件。
证书链
信任体系
Root CA(自签名,预置在操作系统)
└─ Intermediate CA(由 Root CA 签发)
└─ 服务器证书(由 Intermediate CA 签发)证书结构
| 字段 | 说明 |
|---|---|
| Subject | 域名 / 组织信息 |
| Issuer | 签发者 CA |
| 有效期 | notBefore — notAfter |
| 公钥 | RSA 2048+ / ECDSA |
| 签名算法 | SHA256-RSA / SHA256-ECDSA |
| SAN | Subject Alternative Name(多域名) |
验证流程
- 检查有效期
- 检查是否被吊销(CRL / OCSP)
- 逐级验证签名至信任根
- 检查域名是否匹配 SAN / CN
加密套件
TLS 1.2 套件示例
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
│ │ │ │ └─ HMAC 算法
│ │ │ └─ 对称加密算法(AES-128-GCM)
│ │ └─ 证书签名算法(RSA)
│ └─ 密钥交换算法(ECDHE)
└─ 协议版本(TLS)套件选择建议
| 场景 | 推荐套件 |
|---|---|
| 通用(性能优先) | TLS_AES_128_GCM_SHA256(TLS 1.3) |
| 高安全 | TLS_AES_256_GCM_SHA384 |
| 国密合规 | ECC_SM4_GCM_SM3 |
部署最佳实践
Nginx 配置
nginx
server {
listen 443 ssl http2;
ssl_certificate /etc/ssl/certs/server.crt;
ssl_certificate_key /etc/ssl/private/server.key;
# 仅启用安全协议
ssl_protocols TLSv1.2 TLSv1.3;
# 优先使用安全的加密套件
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
# HSTS
add_header Strict-Transport-Security
"max-age=63072000; includeSubDomains; preload" always;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 1.1.1.1 valid=300s;
}证书管理
bash
# 使用 certbot 自动续期(Let's Encrypt)
certbot certonly --nginx -d example.com -d www.example.com
# 查看证书信息
openssl x509 -in server.crt -text -noout
# 测试 TLS 配置
openssl s_client -connect example.com:443 -tls1_2