Kubernetes cert-manager证书管理器
1、安装cert-manager:
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm pull jetstack/cert-manager --untar
helm install cert-manager ./cert-manager --namespace cert-manager --create-namespace --version v1.10.1 --set installCRDs=true
2、创建自签CA,issuer-selfsign.yaml:
# 创建自签的clusterissuer
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: selfsigned-issuer
spec:
selfSigned: {}
---
# 生成证书
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: my-selfsigned-ca
namespace: cert-manager
spec:
isCA: true
commonName: my-selfsigned-ca
secretName: root-secret
privateKey:
algorithm: ECDSA
size: 256
issuerRef:
name: selfsigned-issuer
kind: ClusterIssuer
group: cert-manager.io
---
# 生成以这个证书做为CA的clusterissuer,其他证书由这个CA签发
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: my-ca-issuer
spec:
ca:
secretName: root-secret
3、建立个deployment和svc,nginx.yaml:
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx
name: nginx-svc
spec:
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
selector:
app: nginx
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.20.2
ports:
- containerPort: 80
4、新建ingress,增加注解以自动生成证书,ingress-nginx.yaml:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx
annotations:
cert-manager.io/cluster-issuer: my-ca-issuer
cert-manager.io/common-name: example.com
spec:
ingressClassName: nginx
rules:
- host: nginx.example.com
http:
paths:
- path:
backend:
service:
name: nginx-svc
port:
number: 80
pathType: ImplementationSpecific
tls:
- hosts:
- nginx.example.com
secretName: nginx-tls
5、(演示)使用selfsigned-issuer签发自签证书,ingress直接使用这个secret(关闭注解),certificate.yaml:
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: nginx-tls
namespace: default
spec:
dnsNames:
- nginx.example.com
commonName: example.com
subject:
organizations:
- Example Company Limited
issuerRef:
group: cert-manager.io
kind: ClusterIssuer
name: selfsigned-issuer
secretName: nginx-tls
duration: 87600h #10年
usages:
- digital signature
- key encipherment
6、(演示)使用my-ca-issuer签发自定义CA证书,ingress直接使用这个secret(关闭注解),certificate.yaml:
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: nginx-tls
namespace: default
spec:
dnsNames:
- nginx.example.com
commonName: example.com
subject:
organizations:
- Example Company Limited
issuerRef:
group: cert-manager.io
kind: ClusterIssuer
name: my-ca-issuer
secretName: nginx-tls
duration: 87600h #10年
usages:
- digital signature
- key encipherment
7、ACME协议校验原理:ACME: 自动证书管理环境 Automated Certificate Management Environment
7.1、HTTP-01 校验原理
HTTP-01 的校验原理是给你域名指向的 HTTP 服务增加一个临时 location ,Let’s Encrypt 会发送 http 请求到 http://<YOUR_DOMAIN>/.well-known/acme-challenge/
7.2、DNS-01 校验原理
DNS-01 的校验原理是利用 DNS 提供商的 API Key 拿到你的 DNS 控制权限, 在 Let’s Encrypt 为 ACME 客户端提供令牌后,ACME 客户端 (cert-manager) 将创建从该令牌和您的帐户密钥派生的 TXT 记录,并将该记录放在 _acme-challenge.<YOUR_DOMAIN>。 然后 Let’s Encrypt 将向 DNS 系统查询该记录,如果找到匹配项,就可以颁发证书。此方法不需要你的服务使用 Ingress,并且支持泛域名证书。
(模板)acme协议的clusterissuer,使用http01校验
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-staging
spec:
acme:
# You must replace this email address with your own.
# Let's Encrypt will use this to contact you about expiring
# certificates, and issues related to your account.
email: user@example.com
server: https://acme-staging-v02.api.letsencrypt.org/directory
privateKeySecretRef:
# Secret resource that will be used to store the account's private key.
name: example-issuer-account-key
# Add a single challenge solver, HTTP01 using nginx
solvers:
- http01:
ingress:
class: nginx
(模板)acme协议的clusterissuer,使用dns01校验
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-staging
spec:
acme:
# You must replace this email address with your own.
# Let's Encrypt will use this to contact you about expiring
# certificates, and issues related to your account.
email: user@example.com
server: https://acme-staging-v02.api.letsencrypt.org/directory
privateKeySecretRef:
# Secret resource that will be used to store the account's private key.
name: example-issuer-account-key
# Add a single challenge solver, HTTP01 using nginx
solvers:
- dns01:
cloudflare:
email: user@example.com
apiKeySecretRef:
name: cloudflare-apikey-secret
key: apikey
selector:
dnsNames:
- 'example.com'
- '*.example.com'
8、删除
先将所有cert-manager生成的资源删除,查看资源情况如下:
kubectl get Issuers,ClusterIssuers,Certificates,CertificateRequests,Orders,Challenges --all-namespaces
然后执行helm反安装:
helm uninstall cert-manager --namespace cert-manager
最后删除CDR:
kubectl delete -f https://github.com/cert-manager/cert-manager/releases/download/v1.10.1/cert-manager.crds.yaml
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?