Skip to content

Rancher 证书切换为公共 CA 正式证书(ai-ear.cn)操作手册

  • 日期:2026-08-01
  • 集群sza122020.local(192.168.122.20,RKE2 v1.35.6+rke2r1,3 control-plane 节点 .20/.21/.22)
  • Rancher:v2.14.3(Helm 安装,namespace cattle-system,3 副本)
  • 变更:ingress 证书由 cert-manager 自签证书(rancher-ai-ear-root-ca 签发)切换为公网正式证书(DigiCert 签发的 ai-ear.cn

1. 背景与目标

原证书体系为 cert-manager 自签 CA 链:根 CA(10 年)→ Certificate/cattle-system/tls-rancher-ingress(CN=ai-ear.cn)。自签 CA 不在客户端系统信任库,浏览器访问报 ERR_CERT_AUTHORITY_INVALID,需逐台客户端导入根 CA。

切换目标:使用公网 nginx 站点同款的 DigiCert 正式证书Encryption Everywhere DV TLS CA - G2 签发,SAN:ai-ear.cn / www.ai-ear.cn),客户端零配置直接信任。

变更前变更后
签发者rancher-ai-ear-root-ca(自签)DigiCert Encryption Everywhere DV TLS CA - G2
证书来源cert-manager 自动签发/续期公网服务器 /etc/pki/nginx/ai-ear.cn.crt + private/ai-ear.cn.key(手工同步)
Rancher privateCAtrue(挂载 tls-ca,/cacerts 下发根 CA)false(/cacerts 返回空)
agent-tls-modesystem-storesystem-store(不变,公共 CA 在系统信任库)
续期方式cert-manager 自动手工:证书到期前需重新同步(当前证书 2026-10-15 到期)

2. 操作步骤

2.1 确认公网证书

bash
ssh root@8.153.84.140 'openssl x509 -in /etc/pki/nginx/ai-ear.cn.crt -noout -subject -issuer -dates'
# subject=CN=ai-ear.cn / issuer=DigiCert ... / notAfter=Oct 15 23:59:59 2026 GMT
# .crt 文件含 2 张证书(服务器证书 + 中间证书,完整链)

2.2 下发证书到集群节点并备份原自签证书

bash
# 本地中转(公网服务器 → 本地 → 集群节点)
scp root@8.153.84.140:/etc/pki/nginx/ai-ear.cn.crt \
    root@8.153.84.140:/etc/pki/nginx/private/ai-ear.cn.key /tmp/ai-ear-cert/

# 校验证书与私钥匹配(两次 md5 应一致)
openssl x509 -noout -modulus -in /tmp/ai-ear-cert/ai-ear.cn.crt | md5sum
openssl rsa  -noout -modulus -in /tmp/ai-ear-cert/ai-ear.cn.key | md5sum

scp /tmp/ai-ear-cert/ai-ear.cn.* root@192.168.122.20:/root/

# 节点上备份原自签证书(回滚用)
export KUBECONFIG=/etc/rancher/rke2/rke2.yaml
mkdir -p /root/cert-backup-20260801
kubectl -n cattle-system get secret      tls-rancher-ingress -o yaml > /root/cert-backup-20260801/tls-rancher-ingress-selfsigned.yaml
kubectl -n cattle-system get certificate tls-rancher-ingress -o yaml > /root/cert-backup-20260801/certificate-tls-rancher-ingress.yaml
chmod 600 /root/ai-ear.cn.key

2.3 解除 cert-manager 托管并替换 secret

bash
# 删除 Certificate(不会级联删除 secret),防止 cert-manager 续期时覆盖手工证书
kubectl -n cattle-system delete certificate tls-rancher-ingress

# 用公网证书重建同名 tls secret(ingress 直接引用该 secret,无需改 ingress)
kubectl -n cattle-system create secret tls tls-rancher-ingress \
  --cert=/root/ai-ear.cn.crt --key=/root/ai-ear.cn.key \
  --dry-run=client -o yaml | kubectl apply -f -

2.4 helm 关闭 privateCA 并清理 tls-ca

bash
# --reuse-values 保留原配置,仅覆盖 privateCA(chart 在节点 /root/rancher-2.14.3.tgz)
helm upgrade rancher /root/rancher-2.14.3.tgz -n cattle-system \
  --reuse-values --set privateCA=false

kubectl -n cattle-system rollout status deploy/rancher --timeout=180s
kubectl -n cattle-system delete secret tls-ca   # privateCA=false 后不再挂载

2.5 注册脚本同步调整

公共 CA 模式下 /cacerts 返回空,--ca-checksum 路线不可用;agent-tls-mode=system-store(已为此值)下 agent 用系统 CA 信任库校验,注册命令需剔除 STRICT_VERIFY

bash
curl -fL https://ai-ear.cn/system-agent-install.sh \
  | sed "s/^export STRICT_VERIFY='true'/export STRICT_VERIFY='false'/" \
  | sudo sh -s - --server https://ai-ear.cn --label 'cattle.io/os=linux' \
       --token <TOKEN> --etcd --controlplane --worker

worker/rke2/branch/new_cluster_server.sh 已按此更新。

3. 验证

检查项命令预期结果
内网 ingress 证书echo | openssl s_client -connect 192.168.122.20:443 -servername ai-ear.cnDigiCert 证书,Verify return code: 0
节点直连curl https://ai-ear.cn/healthz(无需 --cacert)HTTP 200
外网 frp 隧道curl https://ai-ear.cn:30443/healthzHTTP 200,同样出示 DigiCert 证书
Rancher Podkubectl -n cattle-system get pods -l app=rancher3/3 Running
/cacertscurl -s https://ai-ear.cn/cacerts | wc -c0(公共 CA 模式预期)

4. 注意事项

  1. 续期为手工操作:证书 2026-10-15 到期。公网站点证书续期后,需把新证书按 2.2~2.3 同步到 tls-rancher-ingress secret(cert-manager 自动续期已解除)。
  2. 回滚kubectl apply -f /root/cert-backup-20260801/(先恢复 Certificate 再恢复 secret),并 helm upgrade --reuse-values --set privateCA=true、重建 tls-ca secret。
  3. rancher.ai-ear.cn 不在新证书 SAN 中(仅 ai-ear.cn / www.ai-ear.cn),访问入口统一为 https://ai-ear.cn(内网 443)与 https://ai-ear.cn:30443(外网 frp)。
  4. cert-manager 与根 CA(cert-manager/rancher-root-ca)保留未删,不影响运行;如彻底不再需要自签体系可另行清理。