一、前言
现如今,互联网安全问题已经引起各个企业的重点关注,门户网站对外提供服务,用户浏览访问,很容易遭受到安全问题,甚至泄露敏感数据信息。而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解析权限即可
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:启用调试模式,输出更详细的调试信息。
此时,会自动在/root/下生成隐藏目录,即/root/.acme.sh/
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 > xxx.net.yaml <<EOF
apiVersion: v1
kind: Secret
metadata:
name: xxx.net
namespace: cicd
type: kubernetes.io/tls
data:
tls.crt: ${cerfile}
tls.key: ${keyfile}
EOF
kubectl apply -f xxx.net.yaml
结合crontab任务区定期执行脚本,完成证书续签
#crontab -l
0 1 * * * /bin/bash /opt/auth.ssl.sh