一、dynv6域名申请证书
1. 获取 HTTP Tokens
点击dynv6网站右上角账户
->keys
,找到HTTP Tokens
点击Add HTTP Tokens
,自定义name
并选择zone
生成TOKEN。
2. 添加 SSH Public Keys
本地主机生成ssh密钥对
1
2
3
4
5
# -t 加密算法
# -C comment 注释
# -f 文件名
# 生成 ssh_dynv6 密钥,ssh_dynv6.pub 公钥
ssh-keygen -t ed25519 -C "example.v6.army" -f ssh_dynv6
将生成的公钥填入网站的 SSH Public Keys
3. 安装acme.sh
1
curl https://get.acme.sh | sh sh -s email=yourmail@qq.com
4. 申请证书
多域名申请证书
同一个 DNS 服务商通过 API 签发证书,只能保存一个域名的 Token 信息,导致多个证书会更新失败。可以为每一个域名创建单独目录分别保存配置,申请和更新证书时--config-home
指定配置文件目录。
1
2
3
4
5
6
7
8
# ssh私钥文件
export KEY="/path/ssh_dynv6"
# http token
export DYNV6_TOKEN="rPSc75..."
# 更改默认ca 更改配置文件位置
/home/user/.acme.sh/acme.sh --config-home /user/acme/example --set-default-ca --server letsencrypt
# 申请证书
/home/user/.acme.sh/acme.sh --config-home /user/acme/example --issue --dns dns_dynv6 -d 'example.v6.army,*.example.v6.army'
注意: 申请证书时会根据第一个域名生成子文件夹名,因此建议*.example.v6.army
放后面。
申请的证书位于/user/acme/example/example.v6.army_ecc/
目录下,证书使用fullchain.cer
,私钥使用example.v6.army.key
。
配置邮件通知
参考:notify · acmesh-official/acme.sh Wiki
126邮箱SMTP配置
1
2
3
4
5
6
7
8
export SMTP_FROM="acme@126.com"
export SMTP_TO="axxxxxx@qq.com"
export SMTP_HOST="smtp.example.com"
export SMTP_SECURE="ssl" # one of "none", "ssl", "tls"
export SMTP_USERNAME="acme@126.com"
export SMTP_PASSWORD="c84xxxxxxxx8"
#
acme.sh --config-home "/user/acme/example" --set-notify --notify-source myservername --notify-hook smtp
配置目录/user/acme/example
下的account.conf
,可手动添加或修改配置:
1
2
3
4
5
6
7
8
9
SAVED_SMTP_BIN='python3'
SAVED_SMTP_FROM='acme@126.com'
SAVED_SMTP_TO='axxxxxx@qq.com'
SAVED_SMTP_HOST='smtp.126.com'
SAVED_SMTP_SECURE='ssl'
SAVED_SMTP_USERNAME='acme@126.com'
SAVED_SMTP_PASSWORD='c84xxxxxxxx8'
NOTIFY_HOOK='smtp'
NOTIFY_SOURCE='server name'
mailgun.com配置
1
2
3
4
5
6
7
export MAILGUN_API_KEY="xxxxxxxxxxxxx"
export MAILGUN_API_DOMAIN="example.com"
export MAILGUN_FROM="acme@example.com"
export MAILGUN_TO="axxxxxx@qq.com"
export MAILGUN_REGION="us|eu" #optional, use "us" as default
#
acme.sh --config-home "/user/acme/example" --set-notify --notify-hook mailgun
5. 更新和安装证书
以safeline-tengine为例,向其更新和安装证书。
本地方式
safeline-tengine证书保存位置:/data/safeline/resources/nginx/certs/
,只需将证书和私钥保存到此目录并重命名为cert_id.crt
和cert_id.key
,之后执行命令docker restart safeline-tengine
即可。
acme.sh配置文件:account.conf
保存api、邮件通知等配置,example.v6.army.conf
保存证书下一次更新时间、安装路径、reloadcmd命令。
因此,使用acme.sh命令一次配置即可实现证书更新与安装的完全自动化。
证书安装配置命令:
1
2
3
4
5
6
# 安装证书到指定路径
acme.sh --config-home "/root/acme/${host}" \
--install-cert -d "${host}.v6.army" \
--key-file "/data/safeline/resources/nginx/certs/cert_${id}.key" \
--fullchain-file "/data/safeline/resources/nginx/certs/cert_${id}.crt" \
--reloadcmd "docker exec safeline-tengine nginx -s reload"
设置自动化任务:
1
/home/user/.acme.sh/acme.sh --renew-all --config-home "/root/acme/${host}"
PS.安装成功后,雷池证书页面显示会有延迟,几分钟再查看即可看到已更新。
API方式
1) 获取TOKEN 在系统设置中生成API TOKEN
2) 获取域名证书对应的ID
1
curl --location 'https:///waf.v6.army/api/open/cert' --header 'X-SLCE-API-TOKEN: Tkek......'
3) 上传证书
API格式 https:///waf.v6.army/api/open/cert
请求类型 POST
请求体如下:
1
2
3
4
5
6
7
8
{
"id": 1,
"manual": {
"crt": "string",
"key": "string"
},
"type": 2
}
若只更新证书,key
可为空("key": ""
)。
type
值为2,不为0。
4) 编写脚本
创建upsert.sh
脚本,传入参数-h host -p path
指定域名和证书文件所在目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#!/bin/bash
path=""
host=""
WAF_API="https://waf.v6.army/api/open/cert"
API_TOKEN="X-SLCE-API-TOKEN: Tkek......"
# 域名与对应id的字典
declare -A dict=(
["example1.v6.army"]=1
["example2.v6.army"]=2
)
# 获取参数
while getopts ":h:p:" opt; do
case $opt in
h)
host="$OPTARG"
;;
p)
path="$OPTARG"
;;
:)
echo "选项 -$OPTARG 需要参数"
exit 1
;;
esac
done
# 校验
if [[ -z "$path" || -z "$host" ]]; then
echo "error -p:path -h:host"
exit 1
fi
id="${dict[$host]:-}"
if [[ -z "$id" ]]; then
echo "error: not found ID"
exit 1
fi
# 将文件中的换行符替换为"\n"字符串
crt=$(sed ':a;N;$!ba;s/\n/\\n/g' ${path}/fullchain.cer)
key=$(sed ':a;N;$!ba;s/\n/\\n/g' ${path}/${host}.key)
# request body
# key 可为空,只更新crt
# type 应为2,为0无效
request="{
\"id\": $id,
\"manual\": {
\"crt\": \"${crt}\",
\"key\": \"${key}\"
},
\"type\": 2
}"
# 创建临时文件
response_file=$(mktemp)
http_code=$(curl -s -o "$response_file" -w "%{http_code}" \
-X POST \
-H "Content-Type: application/json" \
-H "$API_TOKEN" \
-d "$request" \
"$WAF_API")
if [[ "$http_code" != 2* ]]; then
echo "request error (HTTP $http_code)"
cat "$response_file"
rm "$response_file"
exit 1
fi
echo "request sucess!"
jq . "$response_file"
rm "$response_file"
二、Cloudflare域名申请证书
托管到Cloudflare的域名(以example.com为例)可以使用acme申请证书,也可以用1Panel申请证书并自动更新。
1. 获取API令牌、区域ID、账户ID
API 令牌 | Cloudflare
登陆Cloudfalre,右上角用户
->配置文件
->API令牌
->创建令牌
。
权限:区域
、DNS
、编辑
区域资源:包括
、特定区域
、example.com
获取到API令牌
后,进入对应域名的管理页面,获取区域ID
和账户ID
2. 使用acme申请证书
执行命令,生成证书
1
2
3
4
5
6
7
8
# 设置环境变量
export CF_Token="填DNS token"
export CF_Zone_ID="填区域ID"
export CF_Account_ID="填账户ID"
# 更改默认ca 更改配置文件位置
/home/user/.acme.sh/acme.sh --config-home /user/acme/example --set-default-ca --server letsencrypt
# 申请证书
/home/user/.acme.sh/acme.sh --config-home /user/acme/example --issue --dns dns_cf -d 'example.com,*.example.com'
后续的自动化设置跟上面dynv6更新证书一致
2. 使用1Panel申请证书
创建Acme账户
网站
->证书
->Acme账户
->创建
,设置邮箱
、账号类型
和密钥算法
。
创建DNS账户
网站
->证书
->DNS账户
->创建
,设置名称
,类型
为Cloudflare,Email
为账户Cloudflare账户邮箱,API Token
为API令牌。
申请证书
网站
->证书
->申请证书
,填写必要参数,勾选自动续签
、推送证书到本地目录
、申请证书之后执行脚本
本地目录设置为/data/safeline/resources/nginx/certs
执行脚本:
1
2
3
cd /data/safeline/resources/nginx/certs
mv -f fullchain.pem cert_3.crt
mv -f privkey.pem cert_3.key