凭据占位符
CF_Token 已替换为占位符。执行前获取对应令牌,不要将真实值写回笔记。
前言:acme.sh是一个非常好用的用来申请证书的脚本,它开源在Github,它极大地降低了申请证书的难度,支持使用cloudflare api等众多api来申请证书。
本文主要介绍使用此脚本来申请ssl证书,给你的http请求加把锁,具体会使用cloudflare api来介绍。
准备条件:
-
一台被分配了公网IP的主机
-
一个域名(建议购买收费域名)
-
电脑ssh客户端
-
能解决遇到问题的个体
本文主要以Debian10为例,介绍使用新的cloudflare api令牌来申请证书,免费域名已不受cloudflare此种方式来申请证书,请使用付费域名。
2.1、安装配置acme.sh脚本
以root用户ssh登陆到主机,使用下面命令安装配置脚本:
# 更新源并安装socat
apt update && apt -y install socat
# 安装脚本
wget -qO- get.acme.sh | bash
# 让脚本在.bashrc文件追加的一行环境变量生效,以后无论在哪里直接使用acme.sh,不用输绝对路径
source ~/.bashrc
# 由于最新acme.sh脚本默认ca变成了zerossl,现执行下面命令修改脚本默认ca为letsencrypt
acme.sh --set-default-ca --server letsencrypt
2.2、配置Cloudflare局部令牌
2.2.1 创建令牌
根据acme.sh脚本作者提供的文档:使用新的cloudflare api令牌,需要新创建此令牌方可使用:

依照上述图片设置即可,添加区域-DNS-编辑和区域-区域-读取权限,区域资源里面选择包括-账户的所有区域-你的账户。

配置好以后,点击创建令牌,注意此令牌token只会出现一次,切记保存,切记保存,切记保存!!!
2.2.2 获取账户ID和区域ID
根据acme.sh文档,申请证书可能还需要提供两个ID,其中账户ID必须,区域ID可有可无,根据下图方法获取此两个ID:
下拉,找到API区域:
至此,即准备好了申请证书需要的材料:
# 上面第一步创建的令牌,即为token
CF_Token="<CF_API_TOKEN_1>"
# 根据上图分别获取账户ID和区域ID
CF_Account_ID="728ebb6487ea9da946bc6b65f5cef9ec"
CF_Zone_ID="ad4d65c60f0d1859fd7cbd51fea2dddc" //此项非必须
2.3、申请配置证书
2.3.1 申请证书
假定你的域名是example.com,执行下面命令申请证书,非root用户也可执行:
# 执行此命令设置变量的值,acme.sh脚本执行过程会读取
export CF_Token="<CF_API_TOKEN_1>"
export CF_Account_ID="728ebb6487ea9da946bc6b65f5cef9ec"
export CF_Zone_ID="ad4d65c60f0d1859fd7cbd51fea2dddc"
//此项非必须,上面两项需要提供
# us-hy
export CF_Token="<CF_API_TOKEN_2>"
export CF_Account_ID="728ebb6487ea9da946bc6b65f5cef9ec"
export CF_Zone_ID="ad4d65c60f0d1859fd7cbd51fea2dddc"
# 申请证书
acme.sh --issue -d example.com -d *.example.com --dns dns_cf -k ec-256
acme.sh --issue -d us-hy.asuka.quest --dns dns_cf -k ec-256
2.3.2 安装证书到指定位置
假定linux主机里已有/etc/ssl目录,现在要把证书和key安装到此目录下,那么执行下面的命令即可:
acme.sh --installcert -d example.com -d *.example.com --fullchain-file /etc/ssl/web.crt --key-file /etc/ssl/web.key --ecc
# 用--reloadcmd指定安装证书后的命令
acme.sh --installcert -d example.com -d *.example.com --fullchain-file /etc/ssl/web.crt --key-file /etc/ssl/web.key --ecc --reloadcmd "systemctl restart webserver"
说明:脚本更新完证书后,会自动依据上面指定的绝对路径将证书和key安装到指定位置,并根据--reloadcmd执行相应的操作。
2.3.3 证书更新
从letsencrypt申请到的证书有效期是90天,脚本每60天会对证书进行更新,你也可以手动强制更新:
# 查询域名申请证书信息
acme.sh --list
# 手动强制更新证书
acme.sh --renew -d example.com -d *.example.com --force --ecc
acme.sh --renew -d example.com -d *.example.com --force //非ECC证书使用此命令