一、前言

现如今,互联网安全问题已经引起各个企业的重点关注,门户网站对外提供服务,用户浏览访问,很容易遭受到不法分子攻击,甚至泄露敏感数据信息。而SSL 证书已成为保护用户数据和隐私的必备工具,一般情况下,我们会花钱去正规渠道购买证书,如果不想花那钱,自然也是有许多免费 SSL 证书的,但有效期仅为三个月,这就意味着网站管理员需要频繁地更新证书,为了解决这个痛点,就引入了acme工具。

二、实现过程

1、阿里云申请范域名统配符证书

首先需要获取阿里云平台AccessKey,且该Key具有对阿里云的DNS有完全控制权限。否则报错.如下所示

[Sat Sep 14 12:16:39 CST 2024] timeout=
[Sat Sep 14 12:16:39 CST 2024] _CURL='curl --silent --dump-header /root/.acme.sh/http.header  -L  -g '
[Sat Sep 14 12:16:39 CST 2024] ret='0'
[Sat Sep 14 12:16:39 CST 2024] Error add txt for domain:_acme-challenge.51trust.net
[Sat Sep 14 12:16:39 CST 2024] _on_issue_err
[Sat Sep 14 12:16:39 CST 2024] Please add '--debug' or '--log' to check more details.
[Sat Sep 14 12:16:39 CST 2024] See: https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh

为了解决上述问题,只需要针对指定账号下的AcccessKey 授于DNS解析权限即可

基于acme实现SSL证书自动续签以及实战演练_SSL证书

2、下载acme工具并安装

首先安装acme工具。该过程主要会自动更新计划任务以及设置环境变量acme别名等相关初始化操作

[Sat Sep 14 13:39:00 CST 2024]#git clone https://gitee.com/neilpang/acme.sh.git
[Sat Sep 14 13:39:00 CST 2024] /root/acme.sh
[Sat Sep 14 13:39:00 CST 2024]cd /root/acme.sh
[Sat Sep 14 13:39:00 CST 2024] ls
acme.sh  deploy  dnsapi  Dockerfile  LICENSE.md  notify  README.md
[Sat Sep 14 13:39:00 CST 2024]./acme.sh --install -m bixiaoyu@bjca.org.cn
[Sat Sep 14 13:39:00 CST 2024] Installing to /root/.acme.sh
[Sat Sep 14 13:39:00 CST 2024] Installed to /root/.acme.sh/acme.sh
[Sat Sep 14 13:39:00 CST 2024] Installing alias to '/root/.bashrc'
[Sat Sep 14 13:39:00 CST 2024] OK, Close and reopen your terminal to start using acme.sh
[Sat Sep 14 13:39:00 CST 2024] Installing alias to '/root/.cshrc'
[Sat Sep 14 13:39:00 CST 2024] Installing alias to '/root/.tcshrc'
[Sat Sep 14 13:39:00 CST 2024] Installing cron job
[Sat Sep 14 13:39:00 CST 2024] Good, bash is found, so change the shebang to use bash as preferred.
[Sat Sep 14 13:39:00 CST 2024] OK

3、重新加载当前.bashrc环境变量

[root@stdc-26140-rf8th acme.sh]# source ~/.bashrc 
[root@stdc-26140-rf8th acme.sh]# cd 
[root@stdc-26140-rf8th ~]# acme.sh -v 
https://github.com/acmesh-official/acme.sh
v3.0.5

4、配置环境变量

acme提供的泛域名证书只能通过dns的形式来做验证,因此我们需要进入域名解析控制台,创建API ID 和 API Key,这个在开始的时候已经提到,通过阿里云注册专门的账号来获取该账号下的key以及secret加密信息。

[root@stdc-26140-rf8th ~]# export Ali_Key="xxxxxxxx"
[root@stdc-26140-rf8th ~]# export Ali_Secret="xxxxxxxx"

5、生成ssl证书

通过这个命令,acme.sh 将会使用阿里云 DNS 插件,自动完成域名验证并申请包含 kaisir.cn 和 *.kaisir.cn 的 Let's Encrypt 证书。在证书签发成功之后,您将获得有效的通配符证书,可以用于加密HTTPS连接等操作。请确保在执行该命令前已经配置好了阿里云的 API 密钥和相关权限,并确保域名解析设置正确以完成域名验证。

#acme.sh --issue --dns dns_ali -d xxx.net -d *.xxx.net

参数解析:

--issue:表示执行证书签发操作。
--dns dns_ali:指定使用 DNS 阿里云插件来进行域名验证。
-d xxx.net -d '*.xxx.net':指定需要申请证书的域名,包括xxx.net和*.xxx.net,其中*表示通配符,可以匹配子域名。
--dnssleep 300:指定 DNS 插件执行操作前的等待时间,这里为300秒。
--debug:启用调试模式,输出更详细的调试信息。

基于acme实现SSL证书自动续签以及实战演练_SSL证书_02

基于acme实现SSL证书自动续签以及实战演练_DNS_03

此时,会自动在/root/下生成隐藏目录,即/root/.acme.sh/

基于acme实现SSL证书自动续签以及实战演练_SSL证书_04

6、设定Crontab计划任务

我们知道,免费证书使用的周期是三个月,既然已经生成了ssl证书,那么需要结合定时任务周期性的续签证书,这样才能保证证书正常使用

0 1 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

三、案例拓展

在云端一k8s业务场景中,因工具域名网站引用了该免费证书,手动每次手动更新Ingress 域名证书,其证书配置在kubernetes Secret资源类型中,在此之前,我们都是手动更新续签证书内容,非常耗费精力...

此时我想了结合脚本自动取更新Secret引用的TLS证书内容呢?答案是有的,就是基于上次启动续签证书,通过base64进行加密引入Secret yaml文件中,并定期更新,此时Ingress引用的的Secret tsl自然就会以最新的内容生效

#!/bin/bash
cerfile=$(base64 -w0 /root/.acme.sh/xxx.net/fullchain.cer)
keyfile=$(base64 -w0 /root/.acme.sh/xxx.net/xxx.net.key)
cat > 51trust.net.yaml <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: 51trust.net
  namespace: cicd
type: kubernetes.io/tls
data:
  tls.crt: ${cerfile}
  tls.key: ${keyfile}
EOF
kubectl apply -f 51trust.net.yaml

结合crontab任务区定期执行脚本,完成证书续签

#crontab -l 
0 1 * * * /bin/bash /opt/auth.ssl.sh

基于acme实现SSL证书自动续签以及实战演练_SSL证书_05