使用cert-manager签发免费证书

参考

概述

随着 HTTPS 不断普及,大多数网站开始由 HTTP 升级到 HTTPS。使用 HTTPS 需要向权威机构申请证书,并且需要付出一定的成本,如果需求数量多,则开支也相对增加。cert-manager 是 Kubernetes 上的全能证书管理工具,支持利用 cert-manager 基于 ACME 协议与 Let’s Encrypt 签发免费证书并为证书自动续期,实现永久免费使用证书。

操作原理

cert-manager 工作原理
cert-manager 部署到 Kubernetes 集群后会查阅其所支持的自定义资源 CRD,可通过创建 CRD 资源来指示 cert-manager 签发证书并为证书自动续期。如下图所示:
enter description here

  • Issuer/ClusterIssuer:用于指示 cert-manager 签发证书的方式,本文主要讲解签发免费证书的 ACME 方式。
  • Certificate:用于向 cert-manager 传递域名证书的信息、签发证书所需要的配置,以及对 Issuer/ClusterIssuer 的引用。

说明:
Issuer 与 ClusterIssuer 之间的区别是:Issuer 只能用来签发自身所在 namespace 下的证书,ClusterIssuer 可以签发任意 namespace 下的证书。

免费证书签发原理

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://<YOUR_DOMAIN>/.well-known/acme-challenge/<TOKEN>。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.<YOUR_DOMAIN>。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

相关信息

kubernetes version: v1.15.6
helm version: v2.16.1
cert-manager version: v1.1.0

安装步骤

安装crd资源

1
2
3
4
5
# Kubernetes 1.15+
$ kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.1.0/cert-manager.crds.yaml

# Kubernetes <1.15
$ kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.1.0/cert-manager-legacy.crds.yaml

安装

1
2
3
4
5
6
7
8
## Create namespace
kubectl create ns cert-manager

## Add the Jetstack Helm repository
$ helm repo add jetstack https://charts.jetstack.io

## Install the cert-manager helm chart
$ helm install --name cert-manager --namespace cert-manager --version v1.1.0 jetstack/cert-manager

使用阿里webhook签发泛域名证书

install alidns-webhook

1
2
# Install alidns-webhook to cert-manager namespace. 
kubectl apply -f https://raw.githubusercontent.com/pragkent/alidns-webhook/master/deploy/bundle.yaml

Create secret contains alidns credentials

1
2
3
4
5
6
7
8
apiVersion: v1
kind: Secret
metadata:
name: alidns-secret
namespace: cert-manager
data:
access-key: ****base64
secret-key: ****base64

Example Issuer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-test
spec:
acme:
# Change to your letsencrypt email
email: certmaster@example.com
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-test-account-key
solvers:
- dns01:
webhook:
groupName: acme.yourcompany.com
solverName: alidns
config:
region: ""
accessKeySecretRef:
name: alidns-secret
key: access-key
secretKeySecretRef:
name: alidns-secret
key: secret-key

Issue a certificate

1
2
3
4
5
6
7
8
9
10
11
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: letsencrypt-test
spec:
secretName: letsencrypt-test
dnsNames:
- "*.example.com"
issuerRef:
name: letsencrypt-test
kind: ClusterIssuer

获取和使用证书

创建 Certificate 后,即可通过 kubectl 查看证书是否签发成功。

1
$ kubectl get certificate -n namespace

READY 为 False:则表示签发失败,可以通过 describe 命令查看 event 来排查失败原因。
READY 为 True:则表示签发成功,证书将保存在所指定的 Secret 中。例如,default/test-mydomain-com-tls。

补充

如果有多个ingress需要使用证书,并且这些ingress在不同的集群或者不同的namespace中,则

  • 多集群:每个集群需要部署cert-manager,并且每个namespace需要创建certificate
  • 多namespace:每个namespace需要创建certificate
--------------------本文结束,感谢您的阅读--------------------

本文标题:使用cert-manager签发免费证书

文章作者:弓昭

发布时间:2021年02月07日 - 15:17

最后更新:2021年04月21日 - 20:39

原始链接:https://gongzhao1.gitee.io/使用cert-manager签发免费证书/

联系邮箱:gongzhao1@foxmail.com