概述
随着 HTTPS 不断普及,大多数网站开始由 HTTP 升级到 HTTPS。使用 HTTPS 需要向权威机构申请证书,并且需要付出一定的成本,如果需求数量多,则开支也相对增加。cert-manager 是 Kubernetes 上的全能证书管理工具,支持利用 cert-manager 基于 ACME 协议与 Let’s Encrypt 签发免费证书并为证书自动续期,实现永久免费使用证书。
域名使用腾讯云 DNSPod 管理,并期望在 Kubernetes 上为域名自动签发免费证书,可以使用 cert-manager 来实现。
cert-manager 支持许多 DNS provider,但不支持国内的 DNSPod,不过 cert-manager 提供了 Webhook 机制来扩展 provider,社区也有 DNSPod 的 provider 实现。本文将介绍如何结合 cert-manager 与 cert-manager-webhook-dnspod 来实现为 DNSPod 上的域名自动签发免费证书。
操作原理
cert-manager 工作原理
cert-manager 部署到 Kubernetes 集群后会查阅其所支持的自定义资源 CRD,可通过创建CRD 资源来指示 cert-manager 签发证书并为证书自动续期。如下图所示:
Issuers/ClusterIssuer: 用于指示 cert-manager 签发证书的方式,本文主要讲解签发免费证书的 ACME 方式。
说明: Issuer 和 ClusterIssuer 之间的区别是 Issuer 只能用来签发自身所在 namespace 下的证书,ClusterIssuer 可以签发任意 namespace 下的证书。
Certificate: 用于向 cert-manager 传递域名证书信息、签发证书所需要的配置,以及对 Issuer/ClusterIssuer 的引用。
免费签发证书原理
Let’s Encrypt 利用 ACME 协议校验域名的归属,校验成功后可以自动颁发免费证书。免费证书有效期只有90天,需在到期前再校验一次实现续期。使用 cert-manager 可以自动续期,即实现永久使用免费证书。校验域名归属的两种方式分别是 HTTP-01 和 DNS-01,校验原理详情可参见 Let’s Encrypt 的运作方式。
HTTP-01 校验原理
HTTP-01 的校验原理是给域名指向的 HTTP 服务增加一个临时 location。此方法仅适用于给使用 Ingress 暴露流量的服务颁发证书,并且不支持泛域名证书。例如,Let’s Encrypt 会发送 HTTP 请求到 http:///.well-known/acme-challenge/
。YOUR_DOMAIN
是被校验的域名。TOKEN
是 ACME 协议客户端负责放置的文件,在此处 ACME 客户端即 cert-manager,通过修改或创建 Ingress 规则来增加临时校验路径并指向提供 TOKEN
的服务。Let’s Encrypt 会对比 TOKEN
是否符合预期,校验成功后就会颁发证书。
DNS-01 校验原理
DNS-01 的校验原理是利用 DNS 提供商的 API Key 拿到用户 DNS 控制权限。此方法不需要使用 Ingress,并且支持泛域名证书。在 Let’s Encrypt 为 ACME 客户端提供令牌后,ACME 客户端 \(cert-manager\)
将创建从该令牌和账户密钥派生的 TXT 记录,并将该记录放在 _acme-challenge.
。Let’s Encrypt 将向 DNS 系统查询该记录,找到匹配项即可颁发证书。
校验方式对比
HTTP-01 校验方式的优点是配置简单通用,不同 DNS 提供商均可使用相同的配置方法。缺点是需要依赖 Ingress,若仅适用于服务支持 Ingress 暴露流量,不支持泛域名证书。
DNS-01 校验方式的优点是不依赖 Ingress,并支持泛域名。缺点是不同 DNS 提供商的配置方式不同,DNS 提供商过多而 cert-manager 的 Issuer 不能全部支持。部分可以通过部署实现 cert-manager 的 Webhook 服务来扩展 Issuer 进行支持。例如 DNSPod 和 阿里 DNS,详情请参见 Webhook 列表。
操作步骤
安装 cert-manager
修改 values.yaml
部署安装 cert-manager
创建DNSPod 密钥
登录 DNSPod 控制台,在 密钥管理 中创建密钥,复制自动生成的 ID
和 Token
并保存
安装 cert-manager-webhook-dnspod
创建证书
等待状态变成 Ready 表示签发成功:
使用证书
访问测试