上篇 我们讲了 Monitor 健康检查,保证后端 Member 在线。但还有一个更核心的问题没有覆盖------如果你的业务是 HTTPS,谁来处理 TLS 加密?
一、SSL 卸载的核心逻辑
SSL 卸载(SSL Offloading)是 F5 最常用的功能之一,一句话说清楚:
把 HTTPS 加解密的计算量从后端服务器搬到 F5 上,后端只管处理明文 HTTP。
客户端 ──HTTPS(密文)──→ F5 ←──HTTP(明文)──→ 后端
(浏览器) │
TLS 握手
证书验证
解密请求
加密响应
为什么需要这么做?
-
后端不用处理 TLS 加密,省 CPU
-
证书统一管理,只放在 F5 上
-
后端可以简单跑 HTTP
SSL 卸载的两种模式
| 模式 | 客户端 → F5 | F5 → 后端 | 证书位置 | 场景 |
|---|---|---|---|---|
| Offloading(卸载) | HTTPS | HTTP | 只在 F5 | 90% 场景,通用 |
| Re-Encryption(重加密) | HTTPS | HTTPS | F5 + 后端 | 合规要求,跨安全域 |
日常 90% 都是 Offloading 模式。 只有在安全合规要求"全链路加密"的场景下才会用重加密。
二、Client-Side vs Server-Side SSL Profile
F5 的 SSL Profile 分两个方向,这是新手最容易搞混的地方:
| Client-Side(clientssl) | Server-Side(serverssl) | |
|---|---|---|
| 方向 | 客户端 → F5(入站) | F5 → 后端(出站) |
| 作用 | 解密入站的 HTTPS | 加密发往后端的流量 |
| 证书 | 你的业务证书(给浏览器看的) | 后端证书 |
| Offloading 模式 | ✅ 必配 | ❌ 不配 |
| Re-Encryption 模式 | ✅ 必配 | ✅ 必配 |
一句话记法:
-
clientssl= 客户端连 F5,发你的证书给浏览器看 -
serverssl= F5 连后端,F5 作为客户端去验证后端证书
三、RSA vs ECC 证书
区别一览
| 维度 | RSA | ECC(椭圆曲线) |
|---|---|---|
| 密钥长度 | 2048 / 4096 位 | 256 位(P-256) |
| 安全性 | 2048 位 ≈ 安全 | 256 位 ≈ RSA 3072 |
| 握手性能 | 慢,CPU 开销大 | 快,CPU 开销小 |
| 兼容性 | 最好,全支持 | 好,极老客户端不支持 |
| 趋势 | 正在被 ECC 替代 | 越来越主流 |
2026 年推荐策略
1. 新业务 → 优先用 ECC P-256
- 更快的 TLS 握手
- 更小的证书体积
- 所有主流浏览器/客户端都支持
2. 历史遗留 → 保持 RSA 2048,续期时切 ECC
3. 兼容性要求高 → 同时配 RSA + ECC 两个 Profile,让客户端协商
查看证书算法
tmsh list sys crypto cert myapp.crt | grep -E "Key Type|Key Size|Curve"
# RSA 2048 → Key Type: rsa, Key Size: 2048
# ECC P-256 → Key Type: ec, Curve: P-256
四、证书链(Certificate Chain)
什么是证书链
浏览器信任的根证书(CA Root,系统内置)
↑ 信任
中间证书(Intermediate CA)
↑ 信任
你的业务证书(Server Certificate)← 放在 F5 上
如果 F5 只配了业务证书,没配中间证书链:
浏览器 → 收到 F5 的证书 → 发现签发者是 Intermediate CA
→ 浏览器没有 Intermediate CA 的信任锚
→ NET::ERR_CERT_AUTHORITY_INVALID
在 F5 上配置证书链
# 导入证书和中间证书
tmsh install sys crypto cert myapp.crt from-local-file /shared/tmp/your.crt
tmsh install sys crypto key myapp.key from-local-file /shared/tmp/your.key
tmsh install sys crypto ca-bundle myapp-ca.crt from-local-file /shared/tmp/intermediate.crt
# 创建 SSL Profile 时用 chain 参数指向中间证书
tmsh create ltm profile client-ssl myapp-clientssl \
cert myapp.crt \
key myapp.key \
chain myapp-ca.crt \
ciphers DEFAULT:!SSLv3:!TLSv1
验证证书链
# F5 上查
tmsh list sys crypto cert myapp.crt chain
# 外部验证(从客户端机器跑)
openssl s_client -connect 10.0.0.100:443 -showcerts
# Verify return code: 0 (ok) 才是完整的
注意: 像 Let's Encrypt 签发的证书,
fullchain.pem已经包含了证书 + 中间链,此时不需要单独的 chain 参数。
五、完整实操:创建一个 SSL Profile
完整流程
① 申请证书(CA 签发或自签)
② 上传证书 + Key + CA Bundle 到 F5
③ 创建 Client-SSL Profile
④ 绑定到 VS
⑤ 验证
Step 1:上传证书
tmsh install sys crypto cert myapp.crt from-local-file /shared/tmp/your.crt
tmsh install sys crypto key myapp.key from-local-file /shared/tmp/your.key
tmsh install sys crypto ca-bundle myapp-ca.crt from-local-file /shared/tmp/ca-bundle.crt
Step 2:创建 Client-SSL Profile
# 基础版(够用)
tmsh create ltm profile client-ssl myapp-clientssl \
cert myapp.crt \
key myapp.key \
chain myapp-ca.crt \
ciphers DEFAULT:!SSLv3:!TLSv1 \
options { dont-insert-empty-fragments }
# 生产推荐版
tmsh create ltm profile client-ssl myapp-clientssl \
cert myapp.crt \
key myapp.key \
chain myapp-ca.crt \
ciphers DEFAULT:!SSLv3:!TLSv1:!TLSv1.1 \
options { \
dont-insert-empty-fragments \
no-ssl \
no-tlsv1 \
no-tlsv1.1 \
} \
secure-renegotiation require \
sni require
Step 3:绑定到 VS
tmsh modify ltm virtual myapp-vip-443 \
profiles add { myapp-clientssl { context clientside } }
Step 4:验证
# 验证 TLS 握手
openssl s_client -connect 10.0.0.100:443 -servername 10.0.0.100 -showcerts
# 输出应看到:
# Certificate chain → 链完整
# Verify return code: 0 (ok)
# Protocol: TLSv1.3
# 验证证书信息
openssl s_client -connect 10.0.0.100:443 -servername 10.0.0.100 2>&1 | \
openssl x509 -noout -subject -dates -issuer
# 验证 HTTP 请求
curl -k https://10.0.0.100/
# 应正常返回 200
六、SNI(Server Name Indication)
SNI 允许 同一个 VIP 上挂多个 HTTPS 域名,每个域名用不同的证书。
没有 SNI:VIP 10.0.0.100:443 → 只能配一个证书
有 SNI:VIP 10.0.0.100:443 → 根据域名选证书
├─ 客户端请求 www.a.com → 使用 cert-a
└─ 客户端请求 www.b.com → 使用 cert-b
F5 上配置 SNI
# 创建两个 SSL Profile
tmsh create ltm profile client-ssl www-a-clientssl \
cert www.a.com.crt \
key www.a.com.key \
sni-default true \
ciphers DEFAULT:!SSLv3
tmsh create ltm profile client-ssl www-b-clientssl \
cert www.b.com.crt \
key www.b.com.key \
ciphers DEFAULT:!SSLv3
# 绑定到同一个 VS
tmsh modify ltm virtual myapp-vip-443 \
profiles add { \
www-a-clientssl { context clientside } \
www-b-clientssl { context clientside } \
}
注意:
sni-default true的 Profile 作为兜底,不匹配任何域名时用它。极老的客户端不支持 SNI,它们只能拿到默认证书。
七、常见 SSL 问题排查
证书链不完整
症状:浏览器 "NET::ERR_CERT_AUTHORITY_INVALID"
排查:openssl s_client -connect VIP:443 -showcerts
解决:检查 chain 参数是否指向正确的 CA Bundle 文件
证书和 Key 不匹配
症状:TLS 握手失败,日志报 "certificate key mismatch"
排查:在 F5 上对比 hash
openssl x509 -noout -modulus -in /shared/tmp/your.crt | openssl md5
openssl rsa -noout -modulus -in /shared/tmp/your.key | openssl md5
两个 md5 必须一致
解决:重新上传正确的 Key
TLS 版本协商失败
症状:openssl s_client -tls1_0 报错
解决:调整 ciphers
ciphers DEFAULT:!SSLv3:!TLSv1:!TLSv1.1 # 安全,禁用老版本
ciphers DEFAULT:!SSLv3 # 兼容旧客户端
证书过期
# 查看所有证书有效期
tmsh list sys crypto cert | grep -E "validity|Not After|Not Before"
# 更新证书(不需要改 Profile,F5 自动更新引用)
tmsh install sys crypto cert myapp.crt from-local-file /shared/tmp/new-cert.crt
八、SSL Profile 参数速查
| 参数 | 说明 | 推荐值 |
|---|---|---|
cert |
业务证书名 | 你导入的证书名 |
key |
证书对应的私钥 | 和 cert 匹配 |
chain |
CA 中间证书链 | 必须完整 |
ciphers |
加密套件 | DEFAULT:!SSLv3:!TLSv1:!TLSv1.1 |
sni-default |
默认 SNI 证书 | 只有一个证书时设为 true |
sni-require |
强制 SNI | require |
secure-renegotiation |
安全重协商 | require |
九、小结
SSL Profile 是 F5 HTTPS 业务的必修课。记住三个核心点:
-
clientssl是解密入站流量 ,serverssl是加密出站流量,日常只用clientssl -
证书链必须完整,否则浏览器报不受信任
-
新业务优先用 ECC P-256,比 RSA 更快更安全
相关阅读:
-
F5 VIP 上线全流程:Pool / VS / Profile 三板斧
-
F5 健康检查 Monitor 深入篇
-
下一篇:F5 iRules TCL 脚本入门实战