Files
mrlee dda0eb876e feat(cert,scripts,docs): Linux 原生安装包与证书申请三处修复(DNS 解析器 / Buypass 下线 / ZeroSSL 报错与密钥脱敏)(v1.2.13)
- Linux 安装包:scripts/build-linux.ps1 交叉编译出 fonu-<版本>-linux-{amd64,arm64}.tar.gz(二进制 + migrations + systemd 安装脚本 + 运行时资源 + sha256),scripts/fonu-install.sh 负责装机(/opt/fonu、/var/lib/fonu、/etc/fonu/fonu.env 首次生成随机会话密钥)并新增 --reset-admin;装完直接打印初始管理员口令

- 证书 DNS-01:lego 默认读系统 resolv.conf(容器里是 Docker 的 127.0.0.11,不返回权威 NS)导致 could not determine authoritative nameservers;现显式传 AddRecursiveNameservers,默认 223.5.5.5/1.1.1.1/8.8.8.8,设置项 acme_dns_resolvers 可覆盖(system = 回到系统解析器)

- Buypass 已停止签发(2025-10-15)并终止服务(2026-04-15):从可选 CA 移除,历史记录仍可展示,直接提交会被拦下并给出中文原因

- ZeroSSL:422 时带出 error.type/error.code(非 JSON 退回截断正文);同时修掉网络错误把含 access_key 的完整 URL 写进任务日志与 app.log 的密钥泄露

- 测试:解析器列表解析 3 例 + ZeroSSL EAB 4 例(含不泄露密钥断言);gofmt / go build / go vet / go test 全绿
2026-09-27 10:10:15 +08:00

47 lines
1.4 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package acme
import "testing"
func TestParseResolverList(t *testing.T) {
cases := []struct {
name string
raw string
want []string
}{
{"带端口", "223.5.5.5:53, 1.1.1.1:53", []string{"223.5.5.5:53", "1.1.1.1:53"}},
{"缺端口补 53", "8.8.8.8\n9.9.9.9", []string{"8.8.8.8:53", "9.9.9.9:53"}},
{"分号与空格", "223.5.5.5;8.8.4.4 1.0.0.1", []string{"223.5.5.5:53", "8.8.4.4:53", "1.0.0.1:53"}},
{"空值", " ", nil},
{"只留空白项", " , ; \n", nil},
}
for _, item := range cases {
got := parseResolverList(item.raw)
if len(got) != len(item.want) {
t.Fatalf("%s: 期望 %v,实际 %v", item.name, item.want, got)
}
for i := range got {
if got[i] != item.want[i] {
t.Fatalf("%s: 期望 %v,实际 %v", item.name, item.want, got)
}
}
}
}
func TestParseResolverListCapsEntries(t *testing.T) {
raw := "1.1.1.1,1.1.1.2,1.1.1.3,1.1.1.4,1.1.1.5,1.1.1.6,1.1.1.7,1.1.1.8,1.1.1.9,1.1.1.10"
if got := parseResolverList(raw); len(got) != 8 {
t.Fatalf("最多取前 8 条,实际 %d:%v", len(got), got)
}
}
// 内置的默认值必须是 lego 能直接用的 host:port 形式
func TestDefaultResolversAreUsable(t *testing.T) {
got := parseResolverList(defaultACMEDNSResolvers)
if len(got) == 0 {
t.Fatalf("默认解析器解析为空:%q", defaultACMEDNSResolvers)
}
if got[0] != "223.5.5.5:53" {
t.Fatalf("默认解析器首项应带端口,实际 %q", got[0])
}
}