使用 acme.sh 配置自动续签 SSL 证书

一、安装 acme.sh

acme.sh 是一个实现了 ACME 客户端协议的 Bash 脚本, 可以从 Let's Encrypt 生成免费的证书,安装方式十分简单:

curl https://get.acme.sh | sh -s email=you@example.com
# 或者
wget -O - https://get.acme.sh | sh -s email=you@example.com

通过 git 进行源码安装:

git clone https://github.com/acmesh-official/acme.sh.git
cd ./acme.sh
./acme.sh --install -m email=you@example.com

国内用户如果访问 github 缓慢的,也可以拉取 gitee 仓库源码:

git clone https://gitee.com/neilpang/acme.sh.git
cd ./acme.sh
./acme.sh --install -m email=you@example.com
二、申请证书和证书部署

通过 acme.sh 申请证书,并部署证书到指定目录:

# 进入脚本目录
cd ~/.acme.sh/

# 申请和下载证书
./acme.sh --issue -d www.example.com --nginx

# 安装证书
mkdir -p /etc/nginx/letsencrypt/www.example.com
./acme.sh --install-cert -d www.example.com \
--key-file       /etc/nginx/letsencrypt/www.example.com/key.pem  \
--fullchain-file /etc/nginx/letsencrypt/www.example.com/cert.pem \
--reloadcmd     "nginx -s reload"

# 查看已安装证书信息
./acme.sh --info -d www.example.com

nginx 指定证书文件位置的配置参考:

ssl_certificate /etc/nginx/letsencrypt/www.example.com/cert.pem;
ssl_certificate_key /etc/nginx/letsencrypt/www.example.com/key.pem; 
三、证书自动更新

目前证书在 60 天以后会自动更新,无特别情况,无需手动更新。脚本在安装时同时设置了每天定时检测证书是否过期,超过配置中重新申请日期后,会自动申请新的证书,申请成功后将延续最近一次配置的信息进行自动部署到服务器上并进行重启服务。可以查询 cronjob 是否正确安装:

crontab  -l
四、脚本工具更新

目前由于需要及时跟进上游的更新内容,acme.sh 也经常更新以保持同步。

# 手动更新
./acme.sh --upgrade

# 开启自动升级
./acme.sh --upgrade --auto-upgrade

# 关闭自动更新
./acme.sh --upgrade --auto-upgrade 0
五、其他命令参数
# 查询证书列表
./acme.sh --list
# 移除证书
./acme.sh --remove -d www.example.com
六、扩展辅助脚本

为了更方便为新域名配置 SSL, 可以自定义编写 ssl.sh 脚本,我们只关心输入的域名信息,具体过程进行黑盒包装就行。

#!/bin/bash

# 检查是否传递了域名参数
if [ -z "$1" ]; then
  echo "请传递域名作为参数"
  exit 1
fi

DOMAIN=$1
CERT_PATH="/etc/nginx/letsencrypt"

# 进入工具操作目录
cd ~/.acme.sh

# 申请证书
./acme.sh --issue -d $DOMAIN --nginx

# 创建目录存放证书
mkdir -p $CERT_PATH/$DOMAIN

# 安装证书
./acme.sh --install-cert -d $DOMAIN \
--key-file       $CERT_PATH/$DOMAIN/key.pem  \
--fullchain-file $CERT_PATH/$DOMAIN/cert.pem \
--reloadcmd     "nginx -s reload"

echo "证书已成功申请并安装到 $CERT_PATH/$DOMAIN"

通过 ssl.sh 部署域名证书:

# 给脚本授权执行权限
chmod u+x ssl.sh
# 部署证书
./ssl.sh target.example.com
六、acme.sh 官方信息