1. acme.sh 是什么

1.1 一个纯粹用Shell(Unix shell)语言编写的ACME协议客户端. 支持shell就能安装.

1.2 支持非盈利证书颁发机构 letsencrypt.org , 可以自由获取免费证书.

1.3 可以自动更新证书.

1.4 支持主流的DNS服务商(DNSPod.cn(腾讯旗下) 阿里云 Cloudflare GoDaddy Amazon), 可申请通配符的证书. 全部DNS服务商支持列表

1.5 支持每次更新证书时发送通知, 支持主流QQ Dingtalk钉钉 Telegram Email Slack, 完整支持列表

2. 安装acme.sh, 设置默认证书分发机构为letsencrypt.org.

2.1 安装acme.sh

curl https://get.acme.sh | sh -s [email protected]

2.2 设置默认证书分发机构为letsencrypt.org, 原因非盈利机构letsencrypt目前为止比较安全. ZeroSSL则是商业机构. 更多解释 .

acme.sh --set-default-ca  --server  letsencrypt

3. 申请证书常用方式. http和dns方式.

3.1 http方式, 特点简单易操作.

在default.conf增加配置

server{
    listen 80;
    server_name lizicai.com;
    location / {
        root   /root/test/;
        index  index.html index.htm;
    }
}

在域名服务商或DNS服务商增加lizicai.com指向服务ip的a记录.

检查

ping lizicai.com

预期显示服务器ip

如未显示, DNS服务商生效a记录需要时间5分钟~3小时
# 与前面nginx创建的文件夹目录一致
acme.sh  --issue  -d lizicai.com --webroot /root/test/

申请证书成功则存放在 ~/.acme.sh/lizicai.com 目录下.

3.2 dns自动获取证书, 需要转移域名到支持自动获取的api的dns服务商, dnspod 阿里 Cloudflare已支持.

登录阿里云, 获取key和secret

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

acme.sh --issue --dns dns_ali -d lizicai.com

你需要先登录到DNSPod账号, 更改域名dns服务为DNSPod, 然后生成你的api id和api key, 完全免费

export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"

# 可以一次申请2个
acme.sh   --issue   --dns dns_dp   -d lizicai.com  -d www.lizicai.com
# 也可以申请通配域名, * 需要转译
acme.sh   --issue   --dns dns_dp   -d \*.lizicai.com

注册Cloudflare, 更改dns服务为Cloudflare, 我的个人资料->API令牌->查看Global API Key

export CF_Key="你的Global API Key"
export CF_Email="注册Cloudflare邮箱"

acme.sh --issue --dns dns_cf -d \*.lizicai.com

3.3 手动dns, 不需要转移dns服务商, 但是需要手机添加txt记录.

# 根据提示添加记录即可
acme.sh --issue --dns -d lizicai.com

4. 设置crontab定期更新证书

4.1 创建crontab的任务.

Crontab用法, 更多请参考 Crontab使用

添加如下内容, 每月1,15号12点1分钟检验证书,如距离过期<30天, 则自动申请新证书. ${HOME}安装acme.sh的home目录

vim test.cron 添加如下内容

1 12 1,15 * *  ${HOME}/.acme.sh/acme.sh --cron

4.2 任务添加到任务中.

crontab -uroot test.cron

# 检查是否添加成功
crontab -uroot -l

5. 每次更新证书获取更新通知, 了解域名更新成功或失败情况, 有问题及时处理.

网站如果使用HSTS策略, 证书过期巨大影响, 有必要第一时间获知解证书更新情况.

5.1 以Dingtalk钉钉为例. 创建钉钉test群.

创建群test,并点击设置

创建群test,并点击设置

选择智能群助手

选择智能群助手

添加机器人

添加机器人

选择 自定义

选择 自定义

添加

添加

自定义关键词 . 或 acme 都可

自定义关键词 . 或 acme 都可

复制Webhook

复制Webhook

export NOTIFY_LEVEL='3'
export DINGTALK_WEBHOOK='上面复制的Webhook'
export DINGTALK_KEYWORD=acme
acme.sh  --set-notify  --notify-hook dingtalk
设置成功后通知

设置成功后通知

acme.sh --cron
更新证书时的通知

更新证书时的通知

5.2 telegram通知.

@BotFather 申请机器人, /newbot 可获取TELEGRAM_BOT_APITOKEN

@userinfobot 输入 /start 可获取 TELEGRAM_BOT_CHATID

export NOTIFY_LEVEL='3'
export TELEGRAM_BOT_APITOKEN="..."
export TELEGRAM_BOT_CHATID="..."

acme.sh --set-notify --notify-hook telegram
# 测试
acme.sh --cron