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,并点击设置
选择智能群助手
添加机器人
选择 自定义
添加
自定义关键词 . 或 acme 都可
复制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