F5 SSL Profile 证书卸载深入篇

上篇 我们讲了 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 业务的必修课。记住三个核心点:

  1. clientssl 是解密入站流量serverssl 是加密出站流量,日常只用 clientssl

  2. 证书链必须完整,否则浏览器报不受信任

  3. 新业务优先用 ECC P-256,比 RSA 更快更安全

相关阅读:

  • F5 VIP 上线全流程:Pool / VS / Profile 三板斧

  • F5 健康检查 Monitor 深入篇

  • 下一篇:F5 iRules TCL 脚本入门实战

相关推荐
智商偏低2 小时前
Windows Nginx 完整安装 + 启动教程
运维·nginx
Zk.Sun2 小时前
Linux设置触屏双击距离容差
linux·运维·数据库
Let's Chat Coding3 小时前
对称密钥认证:主机和设备共享同一把密钥
运维·服务器·网络
bukeyiwanshui3 小时前
20260622 安装配置ubuntu
linux·运维·ubuntu
写代码的学渣3 小时前
Linux 安装 Swap 交换分区大小标准(通用 + 生产服务器 + 个人 PC)
linux·运维·服务器
tonydf3 小时前
.NET 项目集成可观测性:从架构思考到落地实践
运维·后端
金智维科技官方3 小时前
AI驱动的应付账款自动化,落地时要拆解哪些流程?
运维·人工智能·自动化
写代码的学渣4 小时前
Linux 彻底清空历史命令 & 恢复历史命令(完整版、重启永久生效)
linux·运维·chrome
fei_sun4 小时前
ARP(地址解析协议)与NDP(邻居发现协议)
运维·服务器