1、安装 acme.sh

curl  https://get.acme.sh | sh -s email=my@example.com

安装完成后重新连接SSH,使alias生效

普通用户和 root 用户都可以安装使用,会把 acme.sh 安装到你的 home 目录下,并创建 一个 bash 的 alias
此外会自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书

2、申请证书

方式一:通过HTTP验证文件申请证书

该方式需要能够通过域名+80端口的方式访问到服务器,请根据实际情况选择对应的命令

  • 此命令会将验证文件放到/root/test/目录下,需确保可以通过example.com域名访问到此目录
acme.sh  --issue  -d example.com --webroot /root/test/
  • 此命令会将自动读取Apache配置文件中example.com网站的目录,需确保可以通过example.com域名访问到此目录
acme.sh  --issue  -d example.com --apache
  • 此命令会将自动读取Nginx配置文件中example.com网站的目录,需确保可以通过example.com域名访问到此目录
acme.sh  --issue  -d example.com --nginx
  • 如果你还没有运行任何web服务,80端口是空闲的,那么acme.sh可临时作为网站服务器监听80端口,代替完成验证
acme.sh  --issue -d example.com --standalone

# 当然你也可以指定端口,但前提是你会通过代理或负载均衡转发到该端口。
# 因为 letsencrypt 可只会访问 80 端口哦。
$ acme.sh  --issue  -d example.com  --standalone --httpport 88

方式二:通过校验DNS解析记录申请证书

该方式不需要任何服务器,不需要任何公网IP,只需要添加一个TXT类型的DNS解析记录即可完成验证

方法一:自动修改DNS记录(推荐)

该方法需要调用DNS服务商API接口,且需要开通对应的API权限

export Ali_Key="Ali_Key"
export Ali_Secret="Ali_Secret"
acme.sh --issue --dns dns_ali -d *.example.com -d example2.com
export CF_Key="你的Global API Key"
export CF_Email="注册Cloudflare邮箱"
acme.sh --issue --dns dns_cf -d *.example.com -d example2.com
export DP_Id="DnsPod ID"
export DP_Key="DnsPod Token"
acme.sh --issue --dns dns_dp -d *.example.com -d example2.com

方法二:手动修改DNS记录

使用这种方法 acme.sh 将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。

acme.sh --issue --dns -d *.example.com -d example2.com

在申请证书时指定参数-k 2048,可申请RSA证书;指定参数-k ec-256,可申请ECC证书。(不指定时默认为ECC证书。ECC证书可以和RSA证书同时部署,有着安全性高、处理速度快的优点,但不是所有的证书签发机构都支持ECC证书)

3、自动复制证书并重启Web服务

接下来需要把证书 copy 到真正需要用它的地方。正确的使用方法是使用 --install-cert 命令,并指定目标位置,然后证书文件会被copy到相应的位置。

证书生成以后,默认都放在安装目录下: ~/.acme.sh/,请不要直接使用此目录下的文件,这里面的文件都是脚本内部使用,其目录结构未来可能会发生变化

  • Apache
acme.sh --install-cert -d example.com \
--cert-file      /path/to/certfile/in/apache/cert.pem  \
--key-file       /path/to/keyfile/in/apache/key.pem  \
--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
--reloadcmd     "service apache2 force-reload"
  • Nginx
acme.sh --install-cert -d example.com \
--key-file       /path/to/keyfile/in/nginx/key.pem  \
--fullchain-file /path/to/fullchain/in/nginx/cert.pem \
--reloadcmd     "service nginx force-reload"
  • NPS
acme.sh --install-cert -d example.com \
--key-file       /path/to/keyfile/in/nps/key.pem  \
--fullchain-file /path/to/fullchain/in/nps/cert.pem \
--reloadcmd     "systemctl restart Nps"

如需安装ECC证书,则需添加参数--ecc,例如:

acme.sh --install-cert -d example.com --ecc \
--key-file       /path/to/keyfile/in/nginx/key.pem  \
--fullchain-file /path/to/fullchain/in/nginx/cert.pem \
--reloadcmd     "service nginx force-reload"

4、更新证书

正常情况下证书在 60 天以后会自动更新, 你无需任何操作,你也可以手动执行命令更新

acme.sh --cron

如果申请证书时使用的方法是手动修改DNS记录,在需要更新证书时请执行

acme.sh --renew -d example.com

5、设置通知(非必要)

5.1 设置更新证书通知

  • 钉钉 dingtalk

推送通知到钉钉群聊天机器人,先在群设置中添加一个 webhook 机器人,获得 webhook url,并设置一个 keyword。目前不支持签名模式。官方文档

export DINGTALK_WEBHOOK='复制的Webhook'
export DINGTALK_KEYWORD=acme

acme.sh  --set-notify  --notify-hook dingtalk
  • 飞书 feishu.cn

推送通知到飞书群聊天机器人。先在群设置中添加一个群机器人,获得 webhook 地址,并设置一个关键字(目前暂不支持签名模式)。官方文档

export FEISHU_WEBHOOK='https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxx'
export FEISHU_KEYWORD=acme

acme.sh --set-notify --notify-hook feishu
  • 企业微信 work.weixin.qq.com

推送通知到企业微信群聊天机器人。先在群设置中添加一个群机器人,获得 webhook 地址,并设置一个关键字(目前暂不支持签名模式)。官方文档

export WEIXIN_WORK_WEBHOOK='https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=693a91f6-7xxx-4bc4-97a0-0ec2sifa5aaa'
export WEIXIN_WORK_KEYWORD=acme

acme.sh --set-notify --notify-hook weixin_work
  • Telegram

推送通知到TG机器人,先创建机器人,通过@BotFather获得 token,其次,需要获得TG账户或群组的chat_id,最简单的方法是与你的新机器人开始对话,并向它发送一个简单的测试消息。然后,使用curl,调用getUpdates API接口,并在返回的json对象中寻找您发送的消息的聊天ID。

$ bot_token="...." # 输入机器人Token
$ curl -s "https://api.telegram.org/bot${bot_token}/getUpdates" | python -mjson.tool
{
    "ok": true,
    "result": [
        {
            "message": {
                "chat": {
                    "first_name": "Joe",
                    "id": 12345678,            <----- 这个就是chat_id
                    "last_name": "Bloggs",
                    "type": "private",
                    "username": "joebloggs"
                },
                ......
                "text": "你刚才输入的消息",
                ......
<snip rest of output>
$

一旦你有了API Token和你想让机器人设置通知的chat_id,设置以下两个变量,供通知脚本使用。

export TELEGRAM_BOT_APITOKEN="..."   # 输入上面@BotFather返回的Token
export TELEGRAM_BOT_CHATID="..."     # 输入上面获取到的Chat ID

最后设置acme.sh

acme.sh --set-notify --notify-hook telegram

5.2 设置通知级别,默认为2

#  --notify-level <0|1|2|3>
# 0: 关闭没有通知
# 1: 有错误时才通知
# 2: 证书更新成功或错误才通知
# 3: 跳过更新、更新证书、错误都有通知
acme.sh --set-notify --notify-level 2

5.3 设置通知模式,默认为0

#  --notify-mode <0|1>
# 0: 批量模式,所有更新信息放在一条通知里
# 1: 证书模式,每个域名更新都发一条通知
acme.sh --set-notify --notify-mode 0

6、其他常用命令

6.1 查询所有命令

acme.sh -h

6.2 查看acme.sh版本

acme.sh -v

6.3 acme.sh列出所有已注册证书

acme.sh --list

6.4 acme.sh脚本升级

acme.sh --upgrade

6.5 设置acme.sh自动升级

acme.sh --upgrade --auto-upgrade 1

6.6 关闭acme.sh自动升级

acme.sh --upgrade --auto-upgrade 0

6.7 卸载acme.sh, 并删除所有acme.sh添加的crontab任务.

acme.sh --uninstall

6.8 acme.sh更改申请证书机构

目前版本默认是ZeroSSL,一般不需要修改,可用机构见Wiki

acme.sh --set-default-ca --server zerossl
Last modification:March 26, 2024
如果觉得我的文章对你有用,请随意赞赏