前言

很多时候为了网站的安全性,不得不启用 HTTPS 对网站进行防护,网站一多,每年的证书费用也是一笔不小的开支。所以免费证书是我们很好的一个选择,国内各大公有云厂商也有提供免费证书额度,但免费的证书需要每三个月续签一次,实在麻烦。由此 acme.sh 项目孕育而生,项目地址:https://github.com/acmesh-official/acme.sh

acme.sh 续签证书流程如下:

ssl_update

第一次需要进行安装以及配置运行环境,后续流程写入脚本,定时执行脚本实现 HTTPS 证书自动续签更新


1. 安装 acme.sh

git clone https://gitee.com/neilpang/acme.sh.git
cd acme.sh
./acme.sh --install -m my@example.com

2. 云平台创建一个拥有添加域名解析权限的子账号

在申请证书的过程中,需要对域名进行 DNS 验证以确保拥有该域名的所有权,acme.sh 支持国内几大公有云厂商自动添加域名解析记录,阿里云、腾讯云等,完整名单支持如下:https://github.com/acmesh-official/acme.sh/wiki/dnsapi ,这里以阿里云为例

  • 创建子账号

    RAM 访问控制 --> 身份管理 --> 用户 --> 创建用户

  • 授权域名解析

    RAM 访问控制 --> 身份管理 --> 用户 --> 刚刚创建的用户 --> 权限管理 --> 新增授权 ,授予 AliyunDNSFullAccess 权限

    image-20250307163848983

  • 创建子账号的 AccessKey

    RAM 访问控制 --> 身份管理 --> 用户 --> 刚刚创建的用户 ,获取 AccessKey IDAccessKey Secert

    image-20250307163501580


3. 证书申请

3.1 添加子账号 AccessKey 变量

export Ali_Key="**********"
export Ali_Secret="*********************"

3.2 申请证书

/bin/bash /root/.acme.sh/acme.sh --issue --dns dns_ali -d  test.opsnote.top

我这里用的域名为 test.opsnote.top,证书申请完成

image-20250307165157759


4. 旧证书备份

mkdir /data/nginx-1.24.0/cert/old -p 
mv -f /data/nginx-1.24.0/cert/test.opsnote.top* /data/nginx-1.24.0/cert/old

5. 安装证书

/bin/bash /root/.acme.sh/acme.sh --install-cert -d test.opsnote.top\
  --cert-file /data/nginx-1.24.0/cert/test.opsnote.top.crt\
  --key-file /data/nginx-1.24.0/cert/test.opsnote.top.key\
  --fullchain-file /data/nginx-1.24.0/cert/test.opsnote.top.pem

注意:Nginx 配置证书的时候使用拥有完整证书链的 test.opsnote.top.pem 证书


6. 重启应用

cd /data/nginx-1.24.0 && ./nginx -s reload

7. 验证

image-20250307190756936


8. 一键更新证书脚本

mkdir /data/tools -p && vim /data/tools/cert_update.sh
#!/bin/bash
# 阿里云DNS解析密钥
export Ali_Key="**********"
export Ali_Secret="*********************"
# 更新证书的域名
Domain="test.opsnote.top"

# 证书申请
/bin/bash /root/.acme.sh/acme.sh --issue --dns dns_ali -d ${Domain}

# 旧证书备份
mkdir /data/nginx-1.24.0/cert/old -p
mv -f /data/nginx-1.24.0/cert/${Domain}* /data/nginx-1.24.0/cert/old

# 证书安装
/bin/bash /root/.acme.sh/acme.sh --install-cert -d ${Domain}\
  --cert-file /data/nginx-1.24.0/cert/${Domain}.crt\
  --key-file /data/nginx-1.24.0/cert/${Domain}.key\
  --fullchain-file /data/nginx-1.24.0/cert/${Domain}.pem

# 重启应用
cd /data/nginx-1.24.0 && ./nginx -s reload

  • 授权

    chmod 755 /data/tools/cert_update.sh
    
  • 手动执行一次试试证书是否正常更新,确保流程没问题再配置定时任务

    /bin/bash /data/tools/cert_update.sh
    
  • 脚本仅参考,并不通用,需根据具体情况调整AccessKey、域名及应用路径


9. 配置定时任务

crontab -e
0 1 1 2,4,6,8,10,12 * /bin/bash /data/tools/cert_update.sh

定时任务说明: 偶数月份的第一天凌晨一点进行证书更新

申请的证书是三个月有效期,我们的定时任务设置成两个月自动更新一次证书即可

文章作者: hzbb
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 运维小记
Linux SSL
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝