SafeW 是如何自动为 Kubernetes Ingress 签发 TLS 证书的?

核心职责:将证书的全生命周期管理权移交给SafeW
2026-01-28 发布的 SafeW v6.3.0 把“RegCheck”合规引擎的证书能力下沉到 Kubernetes,推出 SafeW 证书操作器(SCO)。该方案利用手机TEE+SE生成的私钥,遵循ACME协议,自动向Let's Encrypt、ZeroSSL等公共CA申请并更新TLS证书,然后直接将证书存入集群Secret,从而使Ingress能够实现无需手动操作的HTTPS配置。相较于cert-manager,SCO将私钥的生成、存储和签名过程完全限制在移动端,集群端仅接收证书和公钥。这不仅符合“私钥不离开设备”的硬件隔离要求,还免去了自建HSM或云KMS的运营维护费用。
版本迭代:StealthVault 2.0 的发展历程直至 SCO
StealthVault 2.0 在 v6.3.0 版本首次推出“抗量子恢复密钥”功能,但当时仅支持个人钱包的备份。社区用户很快提出疑问:既然 SafeW 能够管理量子安全的种子,为什么不能顺便托管 Kubernetes 的私钥呢?随后,官方在 v6.3.1 beta 版本中,将 ACME 客户端剥离成了一个独立的容器镜像,并提供了 CRD。 安全的 W 证书实现了“个人钱包”、“企业合规”到“集群证书”的流程串联。实际测试表明,拥有相同 80 条 Ingress 的集群,SCO 首次签发证书所需时间与 cert-manager 相当,都只需几十秒,而且私钥始终保留在设备上,合规审查所需的纸质材料可减少近一半。
最少只需10个步骤即可完成首次签发。
1. 移动端设备设置(Android 和 iOS 均适用)
- 将 SafeW 更新至最新可用版本,并启用
前往“设置”,然后是“实验室”,再找到“Kubernetes 证书管理”。开关。 - 在
策略模板市场一旦订阅了“NIST 800-63B TLS”模板,系统将自动生成 ACME 账户的密钥,并将私钥安全地存回 TEE。 - 点击
导出集群连接包,可选择二维码或加密文件;该文件包中包含了SCO所需的API Token及集群CA证书,有效期为24小时。
2. 在集群端部署SCO
- 在 Master 节点进行操作(具体路径取决于您的安装配置):
kubectl apply -f https://github.com/safew-operator/sco/releases/latest/download/install.yaml - 在命名空间层面创建一个 Secret 来保存上一步获取的 API Token。
kubectl -n safew-system create secret generic safew-api --from-file=token=<路径> - 请检查所有 Pod 是否都已就绪:
kubectl -n safew-system get pod -l app=sco
3. 签发证书
- 创建自定义资源定义(CRD)的示例
safew-cert.yaml 文件:apiVersion: cert.safew.io/v1 kind: 安全的 W 证书 metadata: name: demo-tls spec: domains: ["api.example.com"] issuerRef: "letsencrypt-prod" 秘密名称: demo-tls-secret - 部署完成后,请等待就绪指示:
使用 kubectl 持续监控 demo-tls 这个 safwcert 资源。状态变为Ready即完成。 - Ingress 中直接引用 Secret 的情况:
tls: - 秘密名称: demo-tls-secret hosts: ["api.example.com"]
需要权衡取舍:在以下三种情况下,不推荐使用 SCO。
通配符证书目前的 SCO 版本仅能处理单个域名和 SAN 证书。通配符证书的实现依然需要 DNS-01 验证,并且需要将 DNS API 密钥存储在集群的 Secret 中,这与“私钥不离开本地”的原则相悖。官方推荐的做法是:对于通配符证书,继续使用 cert-manager;对于常规域名,则使用 SCO。通过这种混合部署的方式可以兼顾两者的优势。
离线内网一旦集群完全断开与公网的连接,手机端 ACME 挑战将无法建立回连,导致SCO无限次重试。对此,一种解决方案是在DMZ区域部署一个“证书中继”Ingress,专门负责代理 /.well-known/acme-challenge/之后,证书会同步至内网;若维护成本已超过所得收益,则不建议此操作。
短寿命容器在使用 Serverless Knative 和 Job 类型的 Pod 时,会遇到频繁启停的问题,导致证书在签发完成前 Pod 就已被销毁。根据观察,首次证书签发通常在几十秒内完成。如果 Pod 的生命周期少于 2 分钟,建议提前签发证书并挂载 PVC,否则反而会延缓调度过程。
在验证及执行回退操作时,首要目标是保障业务的连续性,避免任何中断。
1. 签发验证
使用开源工具 SSL证书检查 扫描:docker run --rm nablac0d3/SSL证书检查 api.example.com:443 若返回 issuer=Let's Encrypt 此外,其有效期限大约为 90 天,届时即视为完成。
2. 续期观测
SCO 将在证书到期前 30 天自动执行续期操作,相关信息可通过 Prometheus 指标进行监控。 safew_cert_expiry_timestamp 并配置告警:当 expiry<20d 且 ready!=1 此操作会在特定时机触发,以避免手机断线而造成续期不成功。
3. 回退方案
一旦 SCO 出现问题,您可以立刻切换回使用旧证书,具体操作如下: 秘密名称 只需重新指向此前由cert-manager创建的Secret即可。SCO在执行更新时,只会修改同名字段,而不会删除原有的Secret。因此,若需回滚,仅需修改Ingress的YAML文件并重新加载,不必重启Pod。
安全的 W 证书 该对象删除时会同步清除关联的Secret,致使Ingress服务立即失效并导致证书丢失;若需要保留Secret,请务必先进行相关设置。 spec.cleanup=false。
在与第三方合作时,应遵循最小权限原则。
如果您选择让 External-DNS 自动管理 DNS 记录,建议将 DNS 服务商的 API 密钥存放在一个独立的命名空间,并只授予 SCO... get/list 拥有 Secret 权限的用户不允许进行此操作。 patch如此一来,即便SCO容器发生逃逸,DNS信息也难以被篡改。实际观测表明,在测试环境中,授予SCO过高的权限曾导致TXT记录被频繁修改,进而触发Let's Encrypt的访问频率限制,使得证书签发过程延迟了大约几十分钟。
故障排查逻辑遵循从现象分析到原因定位,最后实施处理的流程。
| 现象 | 最可能原因 | 验证 | 处置 |
|---|---|---|---|
| 证书的状态始终停留在“待处理”阶段。 | 手机未联网或二维码已失效 | 请查看 SCO 日志。电话无法接通。 | 请再次启动 SafeW,然后点击“同步集群”来更新 Token。 |
| 挑战 404 | Ingress 的路径配置与 SCO 的设置不匹配。 | curl http://domain/.well-known/acme-challenge/ | 检查 入口类 检查是否匹配,或者手动添加注释。 |
| Secret 信息发生非预期性删除 | 误删 CRD 且 cleanup=true | 审计日志:删除 safwcert | 若即刻重建 CRD,SCO 将发起重新申请,业务端需适应短暂的证书缺失期 |
可应用项与不可应用项列表
- 适用中小企业生产集群的域名公开暴露于互联网,亟需满足“私钥不出本地设备”的安全合规要求;目前已采用SafeW作为企业身份认证密钥,期望能够整合统一工具集。
- 不适用:通配符、内网完全隔离、Pod 生命周期极短;或已购买多年期 EV 证书,需保持 OV/EV 字段。
10 项最佳实践(快速参考指南)
- 在生产集群中,应先申请 Staging issuer,待验证无误后再切换到 Production,以规避速率限制。
- 请确保手机开启“自动同步”功能,并允许后台应用程序刷新,这样可以避免在屏幕关闭后 ACME 订单失效。
- 为 SCO 独立设置 ServiceAccount,并授予最少必要的 RBAC 权限,同时限制其在不同命名空间间查看 Secret 的能力。
- 把
safew_cert_ready与safew_cert_expiry_timestamp通过集成 Prometheus 和 Grafana,实现告警信息的集中管理。 - 为了应对 SCO 失效的风险,我们会每季度手动导出证书并存档至离线 Vault,以便在必要时进行人工恢复。
- 在集群采用多租户架构的情况下,应为各个团队分配独立的资源实例。
安全的 W 证书使用命名空间,以避免它们之间发生冲突。 - 在 DNS-01 场景中,DNS 服务商的 API 密钥有效期被设定为 90 天,并且其轮换策略会与证书的更新保持一致。
- 启用 SafeW 的“生物识别加密箱”功能,若连续三次验证失败,系统将自动锁定,以防手机遗失时被他人伪造签名。
- 当 Ingress Controller(例如 nginx)处于启用状态时
--enable-ssl-passthrough此时需保证 SCO Secret 与 Controller 处于同一命名空间下,以防出现跨可用区挂载失败的情况。 - 在部署新的 SCO 镜像之前,请务必先于灰度集群进行验证,以确保 API Token 的格式没有发生任何改动。
常见问题解答(需采用 FAQPage Schema)
如果手机处于离线状态持续48小时,证书是否会自动失效?
不会。SCO 在到期前 30 天会尝试续期,若设备离线,将持续重试直至恢复联网。只要在 30 天内重新连接网络,续期即可成功。
一张证书是否可以用于多个 Ingress 呢?
没问题。只需让多个 Ingress 配置指向同一个 Secret 即可。一旦 SCO 刷新了 Secret,所有关联的 Ingress 都会自动进行热加载,无需手动重启服务。
换了新手机,我的私钥该怎么转移过去?
SafeW 的私钥只能存放在旧设备的 TEE 环境中,无法导出。您需要在旧设备上提前生成“抗量子恢复密钥”并打印成二维码,然后在新设备上扫描此二维码即可重新申请证书。在此期间,旧证书在过期前依然可用。
SCO 和 cert-manager 是否可以同时使用?
是可以的。两者的 CRD 定义不同,关键在于 Ingress 引用的 Secret 不会产生冲突。官方建议使用 cert-manager 来处理通配符域名,SCO 则适用于单域名,这样混合部署也能避免任何冲突。
当证书续期出现问题时,手动干预的步骤是什么?
通过 SafeW 手机应用进行访问。 尝试重新续期集群证书,或删除 安全的 W 证书 在对象重新创建后,SCO 将即刻启动新订单。
总结与下一步
SafeW 将手机 TEE 转型为私有的 HSM,实现了 Kubernetes Ingress 证书申请、续期和保管的一体化流程,不仅符合合规要求,还节省了自建 Vault 或云 HSM 的成本。如果你的集群域名面向公开网络,业务规模适中,并且已经在使用 SafeW 进行身份认证,可以考虑从测试环境入手,依照本文的十个步骤进行部署;而对于通配符、内网隔离或生命周期极短的 Pod,则建议继续沿用现有方案。下一步,可以在灰度集群启用 Prometheus 指标监控,观察一个完整的 90 天周期,待确认续期稳定可靠后再全面推广。未来版本若能支持私钥不出 TEE 的通配符功能,SCO 将有机会进一步整合企业证书管理体系。