0. 原因letsencrypt获取的证书只有3个月有效期, 每次手动更新易出错也会忘记, 所以使用crontab定时acme.sh定时更新最好不过了.

放下文章结构

图片

1. 安装acme.sh, acme.sh官网中文链接.

# 推荐使用root用户, 后续也以root用户操作的.
curl  https://get.acme.sh | sh

2. 使用acme.sh的dns方式, 这里服务商以cloudflare为例.

  1. 域名使用cloudflare解析(注册cloudflare官方教程更换域名), 拿到Global API Key和邮箱.

  2. 参照官方教程中cloudflare部分.

# Global API Key和邮箱

export CF_Key="cloudflare设置中的Global API Key"
export CF_Email="cloudflare注册邮箱"

# 首次生成域名证书(\*号需要转译)
/root/.acme.sh/acme.sh --issue --dns dns_cf -d \*.actiger.com

TLSCRT=$(cat /root/.acme.sh/\*.actiger.com/\*.actiger.com.cer)

TLSKEY=$(cat /root/.acme.sh/\*.actiger.com/\*.actiger.com.key)

# base64转换

ACTIGER_TLSCRT=$(echo "${TLSCRT}"|base64 -w 10000)

ACTIGER_TLSKEY=$(echo "${TLSKEY}"|base64 -w 10000)

# 生成新的secret.

FILE_ACTIGER="/root/kubernetes/pro-blog-cc6/ingress-secret.yml"

cat << EOF | tee ${FILE_ACTIGER}
apiVersion: v1
data:
  tls.crt: ${ACTIGER_TLSCRT}
  tls.key: ${ACTIGER_TLSKEY}
kind: Secret
metadata:
  name: ingress-secret
  namespace: nginx-space
type: Opaque
EOF

# 生效
cd /root/kubernetes/pro-blog-cc6/ && kubectl apply -f ingress-secret.yml

3. 自动更新证书脚本.

vim /root/autoupdatecert.sh, 脚本内容.

/root/.acme.sh/acme.sh --cron

TLSCRT=$(cat /root/.acme.sh/\*.actiger.com/\*.actiger.com.cer)

TLSKEY=$(cat /root/.acme.sh/\*.actiger.com/\*.actiger.com.key)


ACTIGER_TLSCRT=$(echo "${TLSCRT}"|base64 -w 10000)

ACTIGER_TLSKEY=$(echo "${TLSKEY}"|base64 -w 10000)

# kubernetes中secret在该位置
FILE_ACTIGER="/root/kubernetes/pro-blog-cc6/ingress-secret.yml"

cat << EOF | tee ${FILE_ACTIGER}
apiVersion: v1
data:
  tls.crt: ${ACTIGER_TLSCRT}
  tls.key: ${ACTIGER_TLSKEY}
kind: Secret
metadata:
  name: ingress-secret
  namespace: nginx-space
type: Opaque
EOF

cd /root/kubernetes/pro-blog-cc6/ && kubectl apply -f ingress-secret.yml

4. 添加到定时任务中, 每月1号和15号尝试更新证书, 可参考 crontab用法.

4.1 vim /root/root.cron

#进入脚本目录, 并执行更新证书脚本, 表示每月1号和15号 0点0分去更新证书.

0 0 1,15 * *  cd /root/ && ./autoupdatecert.sh

4.2 添加上面定时任务

crontab -uroot /root/root.cron

5. 附录常见错误.

1. echo $(cat *.actiger.com.cer)与echo “$(cat *.actiger.com.cer)“区别, 第1个输出换行符被替换成了空格, 第2个不会. 在本文脚本中第2个才是正确.

2. unset ${变量名} 删除变量名