GlobalSign 新闻 & 分享

容器化环境必备!ACME 是如何工作的?批量证书自动化管理实现方案

2025年12月08日

在容器化(K8s、Docker)架构中,应用以 “动态扩缩容、多实例部署、频繁迭代” 为核心特征,传统手动申请、部署、续期 SSL 证书的模式已完全失效 —— 容器频繁创建销毁导致证书配置脱节、多域名多实例管理繁琐、漏续期引发业务中断等问题频发。ACME(Automatic Certificate Management Environment)协议作为证书自动化管理的国际标准,凭借 “全流程自动化、批量适配、动态适配”特性,成为容器化环境的证书管理首选方案。本文详解 ACME 工作原理,拆解批量证书自动化管理的落地实现,助力企业攻克容器化环境的证书管理痛点。


一、ACME 工作原理:容器化场景的适配逻辑

ACME 协议的核心是通过 “客户端 - 服务器交互”,实现证书 “申请 - 验证 - 签发 - 续期” 全流程自动化,其工作流程与容器化环境的适配性主要体现在以下 5 个核心步骤:

1. 账户注册与身份认证

流程:ACME 客户端(如 cert-manager、acme.sh)首次对接 CA 时,生成密钥对(账户私钥 / 公钥),向 CA 服务器提交注册请求;企业级场景需通过 EAB(外部账户绑定)凭证完成身份校验,确保账户合法性。

容器化适配:账户私钥存储于容器集群的 Secret 中(如K8s Secret),避免容器重启后密钥丢失,支持集群内多实例共享账户信息。

2. 证书订单创建

流程:客户端根据需求(单域名、通配符、多域名)向 CA 提交证书订单,明确证书类型、加密算法(推荐ECDSA 或 RSA 2048+)、域名列表等信息。

容器化适配:支持动态读取容器标签或配置文件中的域名列表,批量生成订单,适配多实例、多域名的动态部署场景。

3. 域名所有权验证

CA 需验证客户端是否合法持有申请域名,容器化环境优先选择以下两种验证方式,避开端口暴露、服务可达性等痛点:

 DNS-01验证(推荐):客户端通过 DNS 服务商 API 自动添加 TXT 记录,CA 核查记录有效性。适配容器集群、跨节点部署场景,无需暴露 80/443 端口,支持通配符证书批量验证。

HTTP-01验证:客户端在容器内创建临时验证文件,CA 通过 80 端口访问验证。适合单节点、无 DNS API 权限的场景,需确保容器集群的反向代理或ingress 能路由验证请求。

4. 证书签发与交付

流程:CA 验证通过后,签发证书(含证书链、公钥),客户端下载并存储至指定位置(如K8s Secret、本地加密目录)。

容器化适配:证书自动同步至容器可访问的存储介质,支持多实例实时共享,避免容器重启后证书缺失。

5. 自动续期

流程:客户端定期检查证书有效期(默认过期前 30 天触发续期),重复“订单创建 - 验证 - 签发” 流程,自动更新证书。

容器化适配:续期后自动替换旧证书,触发容器或服务重载(如 Nginx  reload),无需人工干预,杜绝漏续风险。


二、批量自动化管理实现方案:容器化环境落地实操

容器化环境以 K8s 为核心场景(企业级主流),以下以「K8s + cert-manager + ACME」为例,详解批量证书管理落地步骤,同时覆盖 Docker Compose 等轻量场景:

1. 环境准备:部署 ACME 客户端

 K8s环境(推荐):通过 Helm 部署 cert-manager,自动创建 CRD(Certificate、ClusterIssuer 等):


helm repo add jetstack https://charts.jetstack.io

helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --set installCRDs=true

DockerCompose 环境:使用 acme.sh 客户端,通过容器化部署实现批量管理,挂载宿主机目录存储证书。


2. 配置 ACME 对接(ClusterIssuer)

创建 ClusterIssuer 资源,对接 ACME CA(如 GlobalsSign),指定验证方式与批量策略:


apiVersion: cert-manager.io/v1

kind: ClusterIssuer

metadata:

  name: acme-prod

spec:

  acme:

    server: https://acme-v02.api.letsencrypt.org/directory  # ACMEv2 服务器

    email: admin@example.com  # 通知邮箱

    privateKeySecretRef:

      name: acme-prod-account-key  # 账户私钥存储 Secret

    solvers:

    - dns01:  # 批量场景优先 DNS-01 验证

        cloudDNS:  # 示例:阿里云 DNS(支持 CloudflareAWS Route53 等)

          serviceAccountSecretRef:

            name: alidns-secret  # DNS 服务商 API 密钥 Secret

            key: credentials.json


3. 批量证书申请与管理

(1)多域名 / 通配符证书批量覆盖

通过 Certificate 资源批量定义证书需求,支持通配符(多子域)、多域名批量保护:


apiVersion: cert-manager.io/v1

kind: Certificate

metadata:

  name: batch-cert  # 批量证书名称

  namespace: default

spec:

  secretName: batch-cert-secret  # 证书存储 Secret

  issuerRef:

    name: acme-prod

    kind: ClusterIssuer

  dnsNames:  # 批量指定域名,支持通配符与多主域

  - example.com

  - "*.example.com"  # 覆盖所有一级子域(批量保护多实例)

  - app.example.cn

  - "*.api.example.cn"

  privateKey:

    algorithm: ECDSA  # 高效加密算法,适配容器轻量化需求

    size: 256

(2)集群级批量管控策略

标签筛选批量管理:为 Certificate 资源添加标签(如 cert-type: batch),通过标签选择器批量操作(如删除、更新):


kubectl get certificates -l cert-type=batch --all-namespaces  # 批量查询

kubectl delete certificates -l cert-type=batch --all-namespaces  # 批量删除

命名空间隔离:通过 Issuer(命名空间级)替代ClusterIssuer,实现不同业务线的证书隔离管理,批量管控更精准。


4. 证书自动化部署与同步

容器挂载:通过 Volume 将证书 Secret 挂载至容器,实现多实例共享:


spec:

  containers:

  - name: app

    image: nginx

    volumeMounts:

    - name: cert-volume

      mountPath: /etc/nginx/certs  # 容器内证书目录

  volumes:

  - name: cert-volume

    secret:

      secretName: batch-cert-secret  # 关联证书 Secret

Ingress自动关联:K8s Ingress 可直接引用 Certificate,自动配置 HTTPS,批量为 ingress 资源添加证书:


apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  annotations:

    cert-manager.io/cluster-issuer: acme-prod  # 自动申请证书

spec:

  tls:

  - hosts:

    - "*.example.com"

    secretName: batch-cert-secret


5. 监控告警与合规保障

监控:通过 Prometheus + Grafana 监控cert-manager 指标(如证书有效期、签发成功率),配置过期前 60 天告警。

日志:开启 cert-manager 详细日志,留存证书申请、续期、验证日志至少1 年,满足合规审计要求。

安全:证书私钥存储于 K8s Secret(加密存储),开启 RBAC 权限控制,仅授权容器访问,禁止明文暴露。


6. 轻量场景适配

使用 acme.sh 容器化部署,批量管理 Docker 容器证书:


version: "3"

services:

  acme:

    image: neilpang/acme.sh

    volumes:

      - ./certs:/acme.sh  # 存储证书

      - ./dns-api:/dns-api  # DNS API 配置

    command: --issue --dns dns_ali -d example.com -d "*.example.com" --renew-hook "docker-compose restart nginx"

通过 --renew-hook 实现续期后自动重启服务,批量同步证书至所有依赖容器。


三、批量管理避坑指南

1.   验证方式选择不当:容器集群跨节点、多地域部署时,避免使用HTTP-01(易因服务不可达导致验证失败),优先 DNS-01 并配置 DNS 记录同步等待时间(如 60 秒)。

2.   批量域名过度集中:单张多域名证书建议不超过50 个域名,避免任一域名失效导致整张证书吊销,批量管理时按业务线拆分证书。

3.   续期未触发服务重载:证书续期后需重启依赖服务(如Nginx、应用容器),通过 renew-hook 或 K8s 探针自动触发,避免容器使用旧证书。

4.   权限不足导致失败:cert-manager 需具备 DNS 服务商 API 权限、Secret 读写权限,通过 RBAC 绑定 ClusterRole,避免批量签发时权限报错。

5.   忽略 CA 速率限制: CA(如GlobalSign)推出的DV低成本证书有域名签发速率限制,批量申请前规划域名分组,避免触发限制导致失败。


ACME 协议通过 “自动化流程 + 标准化对接”,完美解决容器化环境 “动态、批量、高频迭代” 的证书管理痛点 —— 其核心价值在于将证书全生命周期从“人工干预” 转变为 “集群级自动化管控”。在落地实践中,K8s 环境优先选择 cert-manager 实现原生集成,轻量场景采用acme.sh 快速部署,核心是把握 “批量域名覆盖策略、自动化验证与续期、安全合规存储” 三大关键点。


对企业而言,ACME 不仅是降低运维成本的工具,更是容器化架构安全合规的 “基础设施”——通过标准化批量管理方案,可实现证书 “零漏续、零中断、全合规”,为容器化业务的稳定运行筑牢加密底座。

< 返回GlobalSign分享课堂列表