之前使用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 注册

  1. $ curl -s -X POST https://auth.acme-dns.io/register | python -m json.tool
  2. {
  3. "allowfrom": [],
  4. "fulldomain": "0d790c39-3b62-4285-a20e-ec7d15bca014.auth.acme-dns.io",
  5. "password": "0fwKMjRbhWc-la3Lvnl4W607q179KO4PVRx6LFA-",
  6. "subdomain": "0d790c39-3b62-4285-a20e-ec7d15bca014",
  7. "username": "7af0e48d-1678-4475-8a92-343dc64f0cf1"
  8. }

当然,也可以设置allowfrom:

  1. $ curl -s -X POST https://auth.acme-dns.io/register -H "Content-Type: application/json" \
  2. --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,并设置域名,可以设置多个。

  1. cat << EOF > acmedns.json
  2. {
  3. "javachen.xyz": {
  4. "allowfrom": [],
  5. "fulldomain": "0d790c39-3b62-4285-a20e-ec7d15bca014.auth.acme-dns.io",
  6. "password": "0fwKMjRbhWc-la3Lvnl4W607q179KO4PVRx6LFA-",
  7. "subdomain": "0d790c39-3b62-4285-a20e-ec7d15bca014",
  8. "username": "7af0e48d-1678-4475-8a92-343dc64f0cf1"
  9. }
  10. }
  11. EOF

这里设置的是javachen.xyz域名。

添加CNAME记录

在DNS上为javachen.xyz添加一个CNAME记录

  1. _acme-challenge CNAME 0d790c39-3b62-4285-a20e-ec7d15bca014.auth.acme-dns.io

查看DNS解析是否生效:

  1. dig _acme-challenge.javachen.xyz

使用API验证

参考 https://github.com/joohoi/acme-dns
1、查找DNS

  1. dig auth.acme-dns.io

2、调用API设置一条测试txt记录

  1. $ curl -s -X POST \
  2. -H "X-Api-User: 7af0e48d-1678-4475-8a92-343dc64f0cf1" \
  3. -H "X-Api-Key: 0fwKMjRbhWc-la3Lvnl4W607q179KO4PVRx6LFA-" \
  4. -d '{"subdomain": "0d790c39-3b62-4285-a20e-ec7d15bca014", "txt": "___validation_token_received_from_the_ca___"}' \
  5. https://auth.acme-dns.io/update
  6. {"txt": "___validation_token_received_from_the_ca___"}

如果返回 {“error”: “forbidden”} ,可能是DNS缓存、用户名和密码不正确。
3、DNS查找,查看测试txt记录的值

  1. dig -t txt @auth.acme-dns.io 0d790c39-3b62-4285-a20e-ec7d15bca014.auth.acme-dns.io

使用Cert-manager来验证

创建一个secret

  1. kubectl create secret generic acme-dns -n cert-manager --from-file acmedns.json

这里指定命名空间为cert-manager,否则后面创建的ClusterIssuer找不到该Secret。

创建Issuer

  1. cat << EOF | kubectl create -f -
  2. apiVersion: cert-manager.io/v1alpha2
  3. kind: ClusterIssuer
  4. metadata:
  5. name: javachen-xyz-letsencrypt-prod
  6. spec:
  7. acme:
  8. server: https://acme-v02.api.letsencrypt.org/directory
  9. privateKeySecretRef:
  10. name: javachen-xyz-letsencrypt-prod
  11. solvers:
  12. - dns01:
  13. acmedns:
  14. host: https://auth.acme-dns.io
  15. accountSecretRef:
  16. name: acme-dns
  17. key: acmedns.json
  18. EOF

查看状态:

  1. kubectl get ClusterIssuer
  2. kubectl describe ClusterIssuer javachen-xyz-letsencrypt-prod

创建证书

  1. cat << EOF | kubectl create -f -
  2. apiVersion: cert-manager.io/v1alpha2
  3. kind: Certificate
  4. metadata:
  5. name: javachen-xyz-cert
  6. namespace: cert-manager
  7. spec:
  8. secretName: javachen-xyz-cert
  9. renewBefore: 240h
  10. dnsNames:
  11. - "*.javachen.xyz"
  12. issuerRef:
  13. name: javachen-xyz-letsencrypt-prod
  14. kind: ClusterIssuer
  15. EOF

查看状态

  1. kubectl get secret,certificate -n cert-manager
  2. kubectl describe secret javachen-xyz-cert -n cert-manager
  3. kubectl describe certificate javachen-xyz-cert -n cert-manager
  4. kubectl describe CertificateRequest javachen-xyz-cert-542546277 -n cert-manager
  5. kubectl describe order javachen-xyz-cert-542546277-2766464876 -n cert-manager
  6. kubectl describe Challenge javachen-xyz-cert-542546277-2766464876-2618792437 -n cert-manager

等待一段时间,直到证书状态变为True

  1. $ kubectl get certificateNAME READY SECRET AGEcertificate.cert-manager.io/javachen-xyz-cert True javachen-xyz-cert 2m43s

接下来就是测试证书是否可以被使用。

卸载

  1. kubectl delete secret acme-dns -n cert-manager
  2. kubectl delete ClusterIssuer javachen-xyz-letsencrypt-prod
  3. kubectl delete Certificate,secret javachen-xyz-cert -n cert-manager

参考文章