之前使用cert-manager-webhook-dnspod来生成DNSPOD的泛域名的证书,但是遇到 一个问题 导致证书生成失败,所以,需要使用其他方式自动生成泛域名的证书。
Cert Manager默认支持ACME-DNS的方式,详情见文档。文本结合 https://github.com/joohoi/acme-dns ,整理出Cert Manager使用ACME-DNS的方式生成证书的过程。
注册
1、先在 https://auth.acme-dns.io 注册
$ curl -s -X POST https://auth.acme-dns.io/register | python -m json.tool{"allowfrom": [],"fulldomain": "0d790c39-3b62-4285-a20e-ec7d15bca014.auth.acme-dns.io","password": "0fwKMjRbhWc-la3Lvnl4W607q179KO4PVRx6LFA-","subdomain": "0d790c39-3b62-4285-a20e-ec7d15bca014","username": "7af0e48d-1678-4475-8a92-343dc64f0cf1"}
当然,也可以设置allowfrom:
$ curl -s -X POST https://auth.acme-dns.io/register -H "Content-Type: application/json" \--data '{"allowfrom": ["58.19.0.0/16","10.43.0.0/16","192.168.0.0/16"]}' | python -m json.tool
- 58.19.0.0是外网地址网段
- 10.43.0.0是k8s容器IP网段
2、将返回值保持到acmedns.json,并设置域名,可以设置多个。
cat << EOF > acmedns.json{"javachen.xyz": {"allowfrom": [],"fulldomain": "0d790c39-3b62-4285-a20e-ec7d15bca014.auth.acme-dns.io","password": "0fwKMjRbhWc-la3Lvnl4W607q179KO4PVRx6LFA-","subdomain": "0d790c39-3b62-4285-a20e-ec7d15bca014","username": "7af0e48d-1678-4475-8a92-343dc64f0cf1"}}EOF
这里设置的是javachen.xyz域名。
添加CNAME记录
在DNS上为javachen.xyz添加一个CNAME记录
_acme-challenge CNAME 0d790c39-3b62-4285-a20e-ec7d15bca014.auth.acme-dns.io
查看DNS解析是否生效:
dig _acme-challenge.javachen.xyz
使用API验证
参考 https://github.com/joohoi/acme-dns
1、查找DNS
dig auth.acme-dns.io
2、调用API设置一条测试txt记录
$ curl -s -X POST \-H "X-Api-User: 7af0e48d-1678-4475-8a92-343dc64f0cf1" \-H "X-Api-Key: 0fwKMjRbhWc-la3Lvnl4W607q179KO4PVRx6LFA-" \-d '{"subdomain": "0d790c39-3b62-4285-a20e-ec7d15bca014", "txt": "___validation_token_received_from_the_ca___"}' \https://auth.acme-dns.io/update{"txt": "___validation_token_received_from_the_ca___"}
如果返回 {“error”: “forbidden”} ,可能是DNS缓存、用户名和密码不正确。
3、DNS查找,查看测试txt记录的值
dig -t txt @auth.acme-dns.io 0d790c39-3b62-4285-a20e-ec7d15bca014.auth.acme-dns.io
使用Cert-manager来验证
创建一个secret
kubectl create secret generic acme-dns -n cert-manager --from-file acmedns.json
这里指定命名空间为cert-manager,否则后面创建的ClusterIssuer找不到该Secret。
创建Issuer
cat << EOF | kubectl create -f -apiVersion: cert-manager.io/v1alpha2kind: ClusterIssuermetadata:name: javachen-xyz-letsencrypt-prodspec:acme:server: https://acme-v02.api.letsencrypt.org/directoryprivateKeySecretRef:name: javachen-xyz-letsencrypt-prodsolvers:- dns01:acmedns:host: https://auth.acme-dns.ioaccountSecretRef:name: acme-dnskey: acmedns.jsonEOF
查看状态:
kubectl get ClusterIssuerkubectl describe ClusterIssuer javachen-xyz-letsencrypt-prod
创建证书
cat << EOF | kubectl create -f -apiVersion: cert-manager.io/v1alpha2kind: Certificatemetadata:name: javachen-xyz-certnamespace: cert-managerspec:secretName: javachen-xyz-certrenewBefore: 240hdnsNames:- "*.javachen.xyz"issuerRef:name: javachen-xyz-letsencrypt-prodkind: ClusterIssuerEOF
查看状态
kubectl get secret,certificate -n cert-managerkubectl describe secret javachen-xyz-cert -n cert-managerkubectl describe certificate javachen-xyz-cert -n cert-managerkubectl describe CertificateRequest javachen-xyz-cert-542546277 -n cert-managerkubectl describe order javachen-xyz-cert-542546277-2766464876 -n cert-managerkubectl describe Challenge javachen-xyz-cert-542546277-2766464876-2618792437 -n cert-manager
等待一段时间,直到证书状态变为True
$ kubectl get certificateNAME READY SECRET AGEcertificate.cert-manager.io/javachen-xyz-cert True javachen-xyz-cert 2m43s
接下来就是测试证书是否可以被使用。
卸载
kubectl delete secret acme-dns -n cert-managerkubectl delete ClusterIssuer javachen-xyz-letsencrypt-prodkubectl delete Certificate,secret javachen-xyz-cert -n cert-manager
