2024 年初
2024-03
两端对比
2024-12
2025-05
2026-04-03
08:00
04-03
11:19~15:17
2026-04-07
04-07+
测试验证
验证通过后
持续
安全需求提出
客户端 SSL Certificate Pinning(海外场景)
第一期:海外证书校验上线
验证 Amazon 证书链
iOS 实现 ✅
验证根 CA 公钥
++MBgDH5... (Amazon Root CA 1)
ACM 续期不影响
Android 实现 ❌
*.tankaapps.com 验证根 CA 公钥 ✅
*.tanka.ai 只验证叶子公钥 ❌
KM7KHK+c... (ACM 叶子)
未加根 CA 公钥
第二期:国内证书校验上线
新增网宿 CDN 场景
两端一致:验证叶子证书公钥 SoVl8DS+...
两端代码调整
Android: 重构为 OkHttp CertificatePinner
iOS: 调整证书校验参数
验证策略未变
🚨 事故:ACM 自动续期 *.tanka.ai
新密钥对,叶子公钥变了
一期 海外 iOS ✅
验证根 CA 公钥
根 CA 不变 → 通过
一期 海外 Android ❌
验证叶子公钥
叶子变了,无兜底 → 断裂
二期 国内 iOS ✅
验证叶子公钥
国内证书未变 → 不受影响
二期 国内 Android ✅
验证叶子公钥
国内证书未变 → 不受影响
临时修复
让海外 ALB 也使用国内的网宿证书
Android 叶子公钥 pin 匹配 → 恢复
新网宿证书到货
CA: GeoSSL → SHECA(第 3 次换中间 CA)
叶子公钥不变 SoVl8DS+...(同一 CSR)
Android 代码修正
*.tanka.ai 补加根 CA 公钥 ++MBgDH5...
与 iOS 对齐,两端一致
临时域名验证
gw-newcert.tanka.ai(独立测试 ALB)
验证 Android 新代码 + 新网宿证书
覆盖:海外 Amazon / 国内网宿 × iOS / Android
海外切回 Amazon ACM 证书
Ingress annotation 恢复为 efec1826
Android 新代码验证根 CA 公钥 → 不再依赖网宿证书
增加客户端监控面板和告警
Sensor 埋点 → Grafana Dashboard
注:证书到期告警国内外已有(网宿侧 + Blackbox 探测),
此处新增的是客户端侧感知能力
👤 xuweiwei, suyi, tianchao, shirong
🔴 两端不一致!
Android 在 *.tankaapps.com 做对了
但 *.tanka.ai 遗漏了根 CA pin
→ 事故根因
👤 xuweiwei, xiaopeng, tianchao, shirong
ℹ️ 为什么验证叶子公钥?
根 CA (Certum/UCA) 公共 CA,范围太大
中间 CA 已换 3 次,不可靠 →
叶子公钥可通过同一 CSR 控制不变
⚠️ 中间 CA 更换历史
2024初: GeoSSL RSA DV CA
2024-12: GeoSSL DV TLS CA
2026-04: SHECA DV TLS RSA CA A1
连根 CA 都换了 (Certum→UCA)
👤 xiaopeng(排查与修复)
✅ 验证"叶子公钥"策略正确
中间 CA 换了 3 次
叶子公钥因同一 CSR 未变
✅ 海外:两端验证根 CA 公钥
国内:两端验证叶子证书公钥
两端一致
长期策略
海外:永远不用动(根 CA 2038 到期)
国内:每半年更新一次网宿证书(同一 CSR)
监控项
· Cert Pinning 错误(>10/5min → 告警)
· HTTP 错误率飙升(分平台)
· 证书到期倒计时(<14天 → 告警)
· Ingress 证书 annotation 异常