SSL证书安装

SSL证书安装

Posted by Kyon-H on April 2, 2025

一、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

acmesh-official/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.crtcert_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