Latest commit

History

History
276 lines (197 loc) · 9.62 KB

File metadata and controls

276 lines (197 loc) · 9.62 KB

证书自动部署 CLI 工具

English README

一个自动化的 SSL 证书部署工具,用于从 anssl.cn 下载并部署证书到服务器。

特性

  • 🚀 自动化部署证书到 Nginx、Apache、RustFS、1Panel、雷池 WAF,并自动重载本地服务
  • ✅ 内置 HTTP-01 验证服务,自动响应 ACME challenge
  • ☁️ 支持阿里云、腾讯云、七牛云、华为云、火山引擎、京东云、百度云、多吉云和 LeCDN 自动部署
  • 🔧 守护进程模式,支持后台运行
  • 🖥️ 多平台支持:macOS、Linux、Windows(amd64/arm64)

快速开始

1. 安装

Linux/macOS 推荐使用一键安装脚本,默认安装 GitHub Releases 最新版本:

curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | sh

如需固定版本或修改安装目录:

curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | VERSION=v0.6.0 APP_DIR=/opt/anssl sh

默认安装到 /opt/anssl,并创建 /usr/local/bin/anssl 软链接。如需卸载:

# 卸载程序,保留配置
curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | sh -s -- --uninstall
# 卸载程序并删除配置
curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | sh -s -- --uninstall --purge

2. 配置 Nginx

添加 HTTP-01 验证反向代理(用于证书申请):

# 在 server 块中添加location~ ^/.well-known/acme-challenge/(.+)$ {proxy_passhttp://localhost:19000/acme-challenge/$1;proxy_set_header Host $host;}

重载 Nginx:

sudo nginx -t && sudo nginx -s reload

3. 运行

# 启动守护进程
sudo anssl daemon -c /opt/anssl/config.yaml
# 查看状态
anssl status
# 查看日志
anssl log -f

HTTP-01 验证工作流程

  1. 在网站申请免费证书
  2. 后端推送 ACME challenge token 到 CLI
  3. CLI 自动缓存并响应 Let's Encrypt 验证请求
  4. 验证成功,证书签发
  5. 自动下载并部署证书到配置的服务(Nginx/Apache/RustFS/1Panel/雷池 WAF/飞牛OS)
  6. 自动重载 Nginx 和 Apache 服务

全程自动化,无需手动操作。

云服务能力

云资源类部署会先从 deploy 客户端实时发现资源,部署后再回读证书状态进行验收。只有具备资源发现、证书更新和回读验收闭环的产品才会出现在控制台。

云服务Provider 名称已接入能力
阿里云aliyun上传证书、CDN、DCDN、ESA、OSS 自定义域名、CLB、ALB、NLB
腾讯云cloudTencent上传证书、CDN、EdgeOne、COS 自定义域名、CLB
七牛云qiniu上传证书、CDN、DCDN
华为云huawei上传证书、CDN、DCDN、OBS 自定义域名、ELB
火山引擎volcengine上传证书、CDN、DCDN、TOS 自定义域名、CLB、ALB、NLB
京东云jdcloud上传证书、CDN
百度云baidu上传证书、CDN
多吉云dogecloud上传证书、CDN
LeCDNlecdnCDN

京东云、百度云和多吉云当前没有注册 DCDN;LeCDN 只注册 CDN。对应产品具备完整闭环后再开放能力。

常用命令

# 守护进程管理
anssl daemon -c /opt/anssl/config.yaml # 启动守护进程
anssl status # 查看状态
anssl stop # 停止
anssl restart -c /opt/anssl/config.yaml # 重启# 日志查看
anssl log # 查看日志
anssl log -f # 实时跟踪# 更新
anssl check-update # 检查更新
anssl update # 执行更新

故障排除

HTTP-01 验证失败

# 1. 检查 Nginx 配置
sudo nginx -t
cat /etc/nginx/sites-enabled/default | grep acme-challenge
# 2. 检查端口占用
lsof -i :19000
# 3. 测试验证服务
curl http://localhost:19000/acme-challenge/test-token
# 4. 查看日志
anssl log -f

权限错误

# 方式 1:使用 sudo
sudo anssl daemon -c /opt/anssl/config.yaml
# 方式 2:配置用户目录# 修改 /opt/anssl/config.yaml: ssl.path: "$HOME/nginx/ssl"
anssl daemon -c /opt/anssl/config.yaml

开机自启动(systemd)

sudo tee /etc/systemd/system/anssl.service > /dev/null <<EOF[Unit]Description=Certificate Deploy ServiceAfter=network.target[Service]Type=simpleUser=rootExecStart=/usr/local/bin/anssl start -c /opt/anssl/config.yamlRestart=alwaysRestartSec=10[Install]WantedBy=multi-user.targetEOF
sudo systemctl daemon-reload
sudo systemctl enable anssl
sudo systemctl start anssl

RustFS 与飞牛 SSH 部署

RustFS 使用 ssl.rustFS.path 指定证书目录:未填写 SSH 主机时部署到 deploy 客户端本机;填写 SSH 主机、端口、用户名和认证字段后,部署到远程 RustFS 主机。飞牛 OS 在未配置 ssl.feiNiu 时继续使用客户端所在设备的内置部署逻辑,配置后改为 SSH 远程部署。

SSH 支持密码或私钥认证,不需要单独配置 SCP。privateKeyPath 必须指向 deploy 客户端本机上的私钥绝对路径,私钥内容不会写入 config.yaml 或发送到后端。使用私钥认证时,password 可留空,也可作为非 root 用户的 sudo 密码。

ssl:
rustFS:
path: "/opt/rustfs/tls"host: "192.168.1.30"port: 22username: "admin"privateKeyPath: "/home/anssl/.ssh/id_ed25519"privateKeyPassphrase: ""password: ""# 可选的 sudo 密码feiNiu:
host: "192.168.1.20"port: 22username: "admin"password: "your-ssh-password"

雷池 WAF 证书部署

在雷池“通用设置”中生成 API Token,并将管理端地址与 Token 配置到 deploy 客户端。连接测试只调用只读证书列表接口;部署时按新证书的完整 SAN 域名集合查找已有证书,完全一致的记录会全部更新,没有完全一致的记录时新增证书,避免误改仅部分域名重叠的证书。

ssl:
safeLine:
url: "https://waf.example.com:9443"apiToken: "your-safeline-api-token"insecureSkipVerify: false

insecureSkipVerify 默认必须保持 false。只有雷池管理端使用你明确信任的自签名 HTTPS 证书时才可开启;API Token 仅保存在 deploy 客户端本机,不会发送到 ANSSL 后端。

宝塔网站证书部署

在宝塔面板“面板设置 -> API 接口”中启用 API 并生成密钥,然后把面板地址和密钥配置到 deploy 客户端。网页端会实时读取网站及绑定域名,选择具体网站后建立自动部署目标;未启用 HTTPS 的运行中网站也可以选择,首次部署时会自动启用 HTTPS,之后部署会精确替换该网站证书。

ssl:
btPanel:
url: "https://panel.example.com:8888"apiKey: "your-bt-panel-api-key"insecureSkipVerify: false

insecureSkipVerify 仅用于你明确信任的自签名 HTTPS 面板。面板地址、真实网站 ID、API 密钥、证书私钥和面板原始诊断不会作为部署目标数据保存到 ANSSL 后端。

宝塔证书库上传

在部署目标中选择“宝塔证书库”时,deploy 会通过宝塔的 ssl/cert/save_cert 接口保存证书,不绑定具体网站。连接测试只读取证书列表;上传后会在 deploy 客户端本地回读证书详情并校验叶证书 SHA-256 指纹。

常见问题

Q: server.accessKey 在哪里获取? A: 登录 anssl.cn → 控制台 → 开发者 → API 凭证

Q: 支持哪些 Web 服务器和管理面板? A: 支持 Nginx、Apache、RustFS、1Panel、宝塔面板、雷池 WAF 和飞牛 OS 自动部署。RustFS 支持本机目录或 SSH 远程部署;飞牛部署目标默认使用客户端所在设备的内置逻辑,也可配置 ssl.feiNiu 通过 SSH 远程部署。两者都支持密码和私钥认证。

Q: 可以同时部署到多个服务吗? A: 可以。在 config.yaml 中配置所需目标(如 nginxPathapachePathrustFSonePanelbtPanelsafeLine 和可选的远程 feiNiu),并在 anssl.cn 控制台为证书选择对应部署目标。

Q: 1Panel 的 API 密钥在哪里获取? A: 登录 1Panel 面板 → 设置 → 安全 → API 接口 → 生成 API 密钥

Q: 宝塔面板的 API 密钥在哪里获取? A: 登录宝塔面板 → 面板设置 → API 接口 → 开启 API 并生成接口密钥。密钥只需填写在 deploy 客户端本机的 ssl.btPanel.apiKey

Q: 雷池的 API Token 在哪里获取? A: 登录雷池管理端 → 通用设置 → API Token。Token 只需填写在 deploy 客户端本机的 ssl.safeLine.apiToken

Q: 证书会同时部署到本地和云服务吗? A: 在 anssl.cn 控制台配置部署目标时,可以选择部署到本地 CLI(Nginx/Apache/RustFS/1Panel/宝塔面板/雷池 WAF/飞牛OS)或已接入的云服务。每个证书可以配置多个部署目标,实现同时部署。

Q: HTTP-01 验证需要手动操作吗? A: 不需要。配置好 Nginx 反向代理后,验证全程自动完成

开发

# 安装依赖
go mod download
# 运行测试
go test -v ./...
# 构建
go build -o anssl main.go

相关链接

许可证

MIT License

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

History
276 lines (197 loc) · 9.62 KB

File metadata and controls

276 lines (197 loc) · 9.62 KB

证书自动部署 CLI 工具

English README

一个自动化的 SSL 证书部署工具,用于从 anssl.cn 下载并部署证书到服务器。

特性

  • 🚀 自动化部署证书到 Nginx、Apache、RustFS、1Panel、雷池 WAF,并自动重载本地服务
  • ✅ 内置 HTTP-01 验证服务,自动响应 ACME challenge
  • ☁️ 支持阿里云、腾讯云、七牛云、华为云、火山引擎、京东云、百度云、多吉云和 LeCDN 自动部署
  • 🔧 守护进程模式,支持后台运行
  • 🖥️ 多平台支持:macOS、Linux、Windows(amd64/arm64)

快速开始

1. 安装

Linux/macOS 推荐使用一键安装脚本,默认安装 GitHub Releases 最新版本:

curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | sh

如需固定版本或修改安装目录:

curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | VERSION=v0.6.0 APP_DIR=/opt/anssl sh

默认安装到 /opt/anssl,并创建 /usr/local/bin/anssl 软链接。如需卸载:

# 卸载程序,保留配置
curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | sh -s -- --uninstall
# 卸载程序并删除配置
curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | sh -s -- --uninstall --purge

2. 配置 Nginx

添加 HTTP-01 验证反向代理(用于证书申请):

# 在 server 块中添加location~ ^/.well-known/acme-challenge/(.+)$ {proxy_passhttp://localhost:19000/acme-challenge/$1;proxy_set_header Host $host;}

重载 Nginx:

sudo nginx -t && sudo nginx -s reload

3. 运行

# 启动守护进程
sudo anssl daemon -c /opt/anssl/config.yaml
# 查看状态
anssl status
# 查看日志
anssl log -f

HTTP-01 验证工作流程

  1. 在网站申请免费证书
  2. 后端推送 ACME challenge token 到 CLI
  3. CLI 自动缓存并响应 Let's Encrypt 验证请求
  4. 验证成功,证书签发
  5. 自动下载并部署证书到配置的服务(Nginx/Apache/RustFS/1Panel/雷池 WAF/飞牛OS)
  6. 自动重载 Nginx 和 Apache 服务

全程自动化,无需手动操作。

云服务能力

云资源类部署会先从 deploy 客户端实时发现资源,部署后再回读证书状态进行验收。只有具备资源发现、证书更新和回读验收闭环的产品才会出现在控制台。

云服务Provider 名称已接入能力
阿里云aliyun上传证书、CDN、DCDN、ESA、OSS 自定义域名、CLB、ALB、NLB
腾讯云cloudTencent上传证书、CDN、EdgeOne、COS 自定义域名、CLB
七牛云qiniu上传证书、CDN、DCDN
华为云huawei上传证书、CDN、DCDN、OBS 自定义域名、ELB
火山引擎volcengine上传证书、CDN、DCDN、TOS 自定义域名、CLB、ALB、NLB
京东云jdcloud上传证书、CDN
百度云baidu上传证书、CDN
多吉云dogecloud上传证书、CDN
LeCDNlecdnCDN

京东云、百度云和多吉云当前没有注册 DCDN;LeCDN 只注册 CDN。对应产品具备完整闭环后再开放能力。

常用命令

# 守护进程管理
anssl daemon -c /opt/anssl/config.yaml # 启动守护进程
anssl status # 查看状态
anssl stop # 停止
anssl restart -c /opt/anssl/config.yaml # 重启# 日志查看
anssl log # 查看日志
anssl log -f # 实时跟踪# 更新
anssl check-update # 检查更新
anssl update # 执行更新

故障排除

HTTP-01 验证失败

# 1. 检查 Nginx 配置
sudo nginx -t
cat /etc/nginx/sites-enabled/default | grep acme-challenge
# 2. 检查端口占用
lsof -i :19000
# 3. 测试验证服务
curl http://localhost:19000/acme-challenge/test-token
# 4. 查看日志
anssl log -f

权限错误

# 方式 1:使用 sudo
sudo anssl daemon -c /opt/anssl/config.yaml
# 方式 2:配置用户目录# 修改 /opt/anssl/config.yaml: ssl.path: "$HOME/nginx/ssl"
anssl daemon -c /opt/anssl/config.yaml

开机自启动(systemd)

sudo tee /etc/systemd/system/anssl.service > /dev/null <<EOF[Unit]Description=Certificate Deploy ServiceAfter=network.target[Service]Type=simpleUser=rootExecStart=/usr/local/bin/anssl start -c /opt/anssl/config.yamlRestart=alwaysRestartSec=10[Install]WantedBy=multi-user.targetEOF
sudo systemctl daemon-reload
sudo systemctl enable anssl
sudo systemctl start anssl

RustFS 与飞牛 SSH 部署

RustFS 使用 ssl.rustFS.path 指定证书目录:未填写 SSH 主机时部署到 deploy 客户端本机;填写 SSH 主机、端口、用户名和认证字段后,部署到远程 RustFS 主机。飞牛 OS 在未配置 ssl.feiNiu 时继续使用客户端所在设备的内置部署逻辑,配置后改为 SSH 远程部署。

SSH 支持密码或私钥认证,不需要单独配置 SCP。privateKeyPath 必须指向 deploy 客户端本机上的私钥绝对路径,私钥内容不会写入 config.yaml 或发送到后端。使用私钥认证时,password 可留空,也可作为非 root 用户的 sudo 密码。

ssl:
rustFS:
path: "/opt/rustfs/tls"host: "192.168.1.30"port: 22username: "admin"privateKeyPath: "/home/anssl/.ssh/id_ed25519"privateKeyPassphrase: ""password: ""# 可选的 sudo 密码feiNiu:
host: "192.168.1.20"port: 22username: "admin"password: "your-ssh-password"

雷池 WAF 证书部署

在雷池“通用设置”中生成 API Token,并将管理端地址与 Token 配置到 deploy 客户端。连接测试只调用只读证书列表接口;部署时按新证书的完整 SAN 域名集合查找已有证书,完全一致的记录会全部更新,没有完全一致的记录时新增证书,避免误改仅部分域名重叠的证书。

ssl:
safeLine:
url: "https://waf.example.com:9443"apiToken: "your-safeline-api-token"insecureSkipVerify: false

insecureSkipVerify 默认必须保持 false。只有雷池管理端使用你明确信任的自签名 HTTPS 证书时才可开启;API Token 仅保存在 deploy 客户端本机,不会发送到 ANSSL 后端。

宝塔网站证书部署

在宝塔面板“面板设置 -> API 接口”中启用 API 并生成密钥,然后把面板地址和密钥配置到 deploy 客户端。网页端会实时读取网站及绑定域名,选择具体网站后建立自动部署目标;未启用 HTTPS 的运行中网站也可以选择,首次部署时会自动启用 HTTPS,之后部署会精确替换该网站证书。

ssl:
btPanel:
url: "https://panel.example.com:8888"apiKey: "your-bt-panel-api-key"insecureSkipVerify: false

insecureSkipVerify 仅用于你明确信任的自签名 HTTPS 面板。面板地址、真实网站 ID、API 密钥、证书私钥和面板原始诊断不会作为部署目标数据保存到 ANSSL 后端。

宝塔证书库上传

在部署目标中选择“宝塔证书库”时,deploy 会通过宝塔的 ssl/cert/save_cert 接口保存证书,不绑定具体网站。连接测试只读取证书列表;上传后会在 deploy 客户端本地回读证书详情并校验叶证书 SHA-256 指纹。

常见问题

Q: server.accessKey 在哪里获取? A: 登录 anssl.cn → 控制台 → 开发者 → API 凭证

Q: 支持哪些 Web 服务器和管理面板? A: 支持 Nginx、Apache、RustFS、1Panel、宝塔面板、雷池 WAF 和飞牛 OS 自动部署。RustFS 支持本机目录或 SSH 远程部署;飞牛部署目标默认使用客户端所在设备的内置逻辑,也可配置 ssl.feiNiu 通过 SSH 远程部署。两者都支持密码和私钥认证。

Q: 可以同时部署到多个服务吗? A: 可以。在 config.yaml 中配置所需目标(如 nginxPathapachePathrustFSonePanelbtPanelsafeLine 和可选的远程 feiNiu),并在 anssl.cn 控制台为证书选择对应部署目标。

Q: 1Panel 的 API 密钥在哪里获取? A: 登录 1Panel 面板 → 设置 → 安全 → API 接口 → 生成 API 密钥

Q: 宝塔面板的 API 密钥在哪里获取? A: 登录宝塔面板 → 面板设置 → API 接口 → 开启 API 并生成接口密钥。密钥只需填写在 deploy 客户端本机的 ssl.btPanel.apiKey

Q: 雷池的 API Token 在哪里获取? A: 登录雷池管理端 → 通用设置 → API Token。Token 只需填写在 deploy 客户端本机的 ssl.safeLine.apiToken

Q: 证书会同时部署到本地和云服务吗? A: 在 anssl.cn 控制台配置部署目标时,可以选择部署到本地 CLI(Nginx/Apache/RustFS/1Panel/宝塔面板/雷池 WAF/飞牛OS)或已接入的云服务。每个证书可以配置多个部署目标,实现同时部署。

Q: HTTP-01 验证需要手动操作吗? A: 不需要。配置好 Nginx 反向代理后,验证全程自动完成

开发

# 安装依赖
go mod download
# 运行测试
go test -v ./...
# 构建
go build -o anssl main.go

相关链接

许可证

MIT License

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History
276 lines (197 loc) · 9.62 KB

File metadata and controls

276 lines (197 loc) · 9.62 KB

证书自动部署 CLI 工具

English README

一个自动化的 SSL 证书部署工具,用于从 anssl.cn 下载并部署证书到服务器。

特性

  • 🚀 自动化部署证书到 Nginx、Apache、RustFS、1Panel、雷池 WAF,并自动重载本地服务
  • ✅ 内置 HTTP-01 验证服务,自动响应 ACME challenge
  • ☁️ 支持阿里云、腾讯云、七牛云、华为云、火山引擎、京东云、百度云、多吉云和 LeCDN 自动部署
  • 🔧 守护进程模式,支持后台运行
  • 🖥️ 多平台支持:macOS、Linux、Windows(amd64/arm64)

快速开始

1. 安装

Linux/macOS 推荐使用一键安装脚本,默认安装 GitHub Releases 最新版本:

curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | sh

如需固定版本或修改安装目录:

curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | VERSION=v0.6.0 APP_DIR=/opt/anssl sh

默认安装到 /opt/anssl,并创建 /usr/local/bin/anssl 软链接。如需卸载:

# 卸载程序,保留配置
curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | sh -s -- --uninstall
# 卸载程序并删除配置
curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | sh -s -- --uninstall --purge

2. 配置 Nginx

添加 HTTP-01 验证反向代理(用于证书申请):

# 在 server 块中添加location~ ^/.well-known/acme-challenge/(.+)$ {proxy_passhttp://localhost:19000/acme-challenge/$1;proxy_set_header Host $host;}

重载 Nginx:

sudo nginx -t && sudo nginx -s reload

3. 运行

# 启动守护进程
sudo anssl daemon -c /opt/anssl/config.yaml
# 查看状态
anssl status
# 查看日志
anssl log -f

HTTP-01 验证工作流程

  1. 在网站申请免费证书
  2. 后端推送 ACME challenge token 到 CLI
  3. CLI 自动缓存并响应 Let's Encrypt 验证请求
  4. 验证成功,证书签发
  5. 自动下载并部署证书到配置的服务(Nginx/Apache/RustFS/1Panel/雷池 WAF/飞牛OS)
  6. 自动重载 Nginx 和 Apache 服务

全程自动化,无需手动操作。

云服务能力

云资源类部署会先从 deploy 客户端实时发现资源,部署后再回读证书状态进行验收。只有具备资源发现、证书更新和回读验收闭环的产品才会出现在控制台。

云服务Provider 名称已接入能力
阿里云aliyun上传证书、CDN、DCDN、ESA、OSS 自定义域名、CLB、ALB、NLB
腾讯云cloudTencent上传证书、CDN、EdgeOne、COS 自定义域名、CLB
七牛云qiniu上传证书、CDN、DCDN
华为云huawei上传证书、CDN、DCDN、OBS 自定义域名、ELB
火山引擎volcengine上传证书、CDN、DCDN、TOS 自定义域名、CLB、ALB、NLB
京东云jdcloud上传证书、CDN
百度云baidu上传证书、CDN
多吉云dogecloud上传证书、CDN
LeCDNlecdnCDN

京东云、百度云和多吉云当前没有注册 DCDN;LeCDN 只注册 CDN。对应产品具备完整闭环后再开放能力。

常用命令

# 守护进程管理
anssl daemon -c /opt/anssl/config.yaml # 启动守护进程
anssl status # 查看状态
anssl stop # 停止
anssl restart -c /opt/anssl/config.yaml # 重启# 日志查看
anssl log # 查看日志
anssl log -f # 实时跟踪# 更新
anssl check-update # 检查更新
anssl update # 执行更新

故障排除

HTTP-01 验证失败

# 1. 检查 Nginx 配置
sudo nginx -t
cat /etc/nginx/sites-enabled/default | grep acme-challenge
# 2. 检查端口占用
lsof -i :19000
# 3. 测试验证服务
curl http://localhost:19000/acme-challenge/test-token
# 4. 查看日志
anssl log -f

权限错误

# 方式 1:使用 sudo
sudo anssl daemon -c /opt/anssl/config.yaml
# 方式 2:配置用户目录# 修改 /opt/anssl/config.yaml: ssl.path: "$HOME/nginx/ssl"
anssl daemon -c /opt/anssl/config.yaml

开机自启动(systemd)

sudo tee /etc/systemd/system/anssl.service > /dev/null <<EOF[Unit]Description=Certificate Deploy ServiceAfter=network.target[Service]Type=simpleUser=rootExecStart=/usr/local/bin/anssl start -c /opt/anssl/config.yamlRestart=alwaysRestartSec=10[Install]WantedBy=multi-user.targetEOF
sudo systemctl daemon-reload
sudo systemctl enable anssl
sudo systemctl start anssl

RustFS 与飞牛 SSH 部署

RustFS 使用 ssl.rustFS.path 指定证书目录:未填写 SSH 主机时部署到 deploy 客户端本机;填写 SSH 主机、端口、用户名和认证字段后,部署到远程 RustFS 主机。飞牛 OS 在未配置 ssl.feiNiu 时继续使用客户端所在设备的内置部署逻辑,配置后改为 SSH 远程部署。

SSH 支持密码或私钥认证,不需要单独配置 SCP。privateKeyPath 必须指向 deploy 客户端本机上的私钥绝对路径,私钥内容不会写入 config.yaml 或发送到后端。使用私钥认证时,password 可留空,也可作为非 root 用户的 sudo 密码。

ssl:
rustFS:
path: "/opt/rustfs/tls"host: "192.168.1.30"port: 22username: "admin"privateKeyPath: "/home/anssl/.ssh/id_ed25519"privateKeyPassphrase: ""password: ""# 可选的 sudo 密码feiNiu:
host: "192.168.1.20"port: 22username: "admin"password: "your-ssh-password"

雷池 WAF 证书部署

在雷池“通用设置”中生成 API Token,并将管理端地址与 Token 配置到 deploy 客户端。连接测试只调用只读证书列表接口;部署时按新证书的完整 SAN 域名集合查找已有证书,完全一致的记录会全部更新,没有完全一致的记录时新增证书,避免误改仅部分域名重叠的证书。

ssl:
safeLine:
url: "https://waf.example.com:9443"apiToken: "your-safeline-api-token"insecureSkipVerify: false

insecureSkipVerify 默认必须保持 false。只有雷池管理端使用你明确信任的自签名 HTTPS 证书时才可开启;API Token 仅保存在 deploy 客户端本机,不会发送到 ANSSL 后端。

宝塔网站证书部署

在宝塔面板“面板设置 -> API 接口”中启用 API 并生成密钥,然后把面板地址和密钥配置到 deploy 客户端。网页端会实时读取网站及绑定域名,选择具体网站后建立自动部署目标;未启用 HTTPS 的运行中网站也可以选择,首次部署时会自动启用 HTTPS,之后部署会精确替换该网站证书。

ssl:
btPanel:
url: "https://panel.example.com:8888"apiKey: "your-bt-panel-api-key"insecureSkipVerify: false

insecureSkipVerify 仅用于你明确信任的自签名 HTTPS 面板。面板地址、真实网站 ID、API 密钥、证书私钥和面板原始诊断不会作为部署目标数据保存到 ANSSL 后端。

宝塔证书库上传

在部署目标中选择“宝塔证书库”时,deploy 会通过宝塔的 ssl/cert/save_cert 接口保存证书,不绑定具体网站。连接测试只读取证书列表;上传后会在 deploy 客户端本地回读证书详情并校验叶证书 SHA-256 指纹。

常见问题

Q: server.accessKey 在哪里获取? A: 登录 anssl.cn → 控制台 → 开发者 → API 凭证

Q: 支持哪些 Web 服务器和管理面板? A: 支持 Nginx、Apache、RustFS、1Panel、宝塔面板、雷池 WAF 和飞牛 OS 自动部署。RustFS 支持本机目录或 SSH 远程部署;飞牛部署目标默认使用客户端所在设备的内置逻辑,也可配置 ssl.feiNiu 通过 SSH 远程部署。两者都支持密码和私钥认证。

Q: 可以同时部署到多个服务吗? A: 可以。在 config.yaml 中配置所需目标(如 nginxPathapachePathrustFSonePanelbtPanelsafeLine 和可选的远程 feiNiu),并在 anssl.cn 控制台为证书选择对应部署目标。

Q: 1Panel 的 API 密钥在哪里获取? A: 登录 1Panel 面板 → 设置 → 安全 → API 接口 → 生成 API 密钥

Q: 宝塔面板的 API 密钥在哪里获取? A: 登录宝塔面板 → 面板设置 → API 接口 → 开启 API 并生成接口密钥。密钥只需填写在 deploy 客户端本机的 ssl.btPanel.apiKey

Q: 雷池的 API Token 在哪里获取? A: 登录雷池管理端 → 通用设置 → API Token。Token 只需填写在 deploy 客户端本机的 ssl.safeLine.apiToken

Q: 证书会同时部署到本地和云服务吗? A: 在 anssl.cn 控制台配置部署目标时,可以选择部署到本地 CLI(Nginx/Apache/RustFS/1Panel/宝塔面板/雷池 WAF/飞牛OS)或已接入的云服务。每个证书可以配置多个部署目标,实现同时部署。

Q: HTTP-01 验证需要手动操作吗? A: 不需要。配置好 Nginx 反向代理后,验证全程自动完成

开发

# 安装依赖
go mod download
# 运行测试
go test -v ./...
# 构建
go build -o anssl main.go

相关链接

许可证

MIT License

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History
276 lines (197 loc) · 9.62 KB

File metadata and controls

276 lines (197 loc) · 9.62 KB

证书自动部署 CLI 工具

English README

一个自动化的 SSL 证书部署工具,用于从 anssl.cn 下载并部署证书到服务器。

特性

  • 🚀 自动化部署证书到 Nginx、Apache、RustFS、1Panel、雷池 WAF,并自动重载本地服务
  • ✅ 内置 HTTP-01 验证服务,自动响应 ACME challenge
  • ☁️ 支持阿里云、腾讯云、七牛云、华为云、火山引擎、京东云、百度云、多吉云和 LeCDN 自动部署
  • 🔧 守护进程模式,支持后台运行
  • 🖥️ 多平台支持:macOS、Linux、Windows(amd64/arm64)

快速开始

1. 安装

Linux/macOS 推荐使用一键安装脚本,默认安装 GitHub Releases 最新版本:

curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | sh

如需固定版本或修改安装目录:

curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | VERSION=v0.6.0 APP_DIR=/opt/anssl sh

默认安装到 /opt/anssl,并创建 /usr/local/bin/anssl 软链接。如需卸载:

# 卸载程序,保留配置
curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | sh -s -- --uninstall
# 卸载程序并删除配置
curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | sh -s -- --uninstall --purge

2. 配置 Nginx

添加 HTTP-01 验证反向代理(用于证书申请):

# 在 server 块中添加location~ ^/.well-known/acme-challenge/(.+)$ {proxy_passhttp://localhost:19000/acme-challenge/$1;proxy_set_header Host $host;}

重载 Nginx:

sudo nginx -t && sudo nginx -s reload

3. 运行

# 启动守护进程
sudo anssl daemon -c /opt/anssl/config.yaml
# 查看状态
anssl status
# 查看日志
anssl log -f

HTTP-01 验证工作流程

  1. 在网站申请免费证书
  2. 后端推送 ACME challenge token 到 CLI
  3. CLI 自动缓存并响应 Let's Encrypt 验证请求
  4. 验证成功,证书签发
  5. 自动下载并部署证书到配置的服务(Nginx/Apache/RustFS/1Panel/雷池 WAF/飞牛OS)
  6. 自动重载 Nginx 和 Apache 服务

全程自动化,无需手动操作。

云服务能力

云资源类部署会先从 deploy 客户端实时发现资源,部署后再回读证书状态进行验收。只有具备资源发现、证书更新和回读验收闭环的产品才会出现在控制台。

云服务Provider 名称已接入能力
阿里云aliyun上传证书、CDN、DCDN、ESA、OSS 自定义域名、CLB、ALB、NLB
腾讯云cloudTencent上传证书、CDN、EdgeOne、COS 自定义域名、CLB
七牛云qiniu上传证书、CDN、DCDN
华为云huawei上传证书、CDN、DCDN、OBS 自定义域名、ELB
火山引擎volcengine上传证书、CDN、DCDN、TOS 自定义域名、CLB、ALB、NLB
京东云jdcloud上传证书、CDN
百度云baidu上传证书、CDN
多吉云dogecloud上传证书、CDN
LeCDNlecdnCDN

京东云、百度云和多吉云当前没有注册 DCDN;LeCDN 只注册 CDN。对应产品具备完整闭环后再开放能力。

常用命令

# 守护进程管理
anssl daemon -c /opt/anssl/config.yaml # 启动守护进程
anssl status # 查看状态
anssl stop # 停止
anssl restart -c /opt/anssl/config.yaml # 重启# 日志查看
anssl log # 查看日志
anssl log -f # 实时跟踪# 更新
anssl check-update # 检查更新
anssl update # 执行更新

故障排除

HTTP-01 验证失败

# 1. 检查 Nginx 配置
sudo nginx -t
cat /etc/nginx/sites-enabled/default | grep acme-challenge
# 2. 检查端口占用
lsof -i :19000
# 3. 测试验证服务
curl http://localhost:19000/acme-challenge/test-token
# 4. 查看日志
anssl log -f

权限错误

# 方式 1:使用 sudo
sudo anssl daemon -c /opt/anssl/config.yaml
# 方式 2:配置用户目录# 修改 /opt/anssl/config.yaml: ssl.path: "$HOME/nginx/ssl"
anssl daemon -c /opt/anssl/config.yaml

开机自启动(systemd)

sudo tee /etc/systemd/system/anssl.service > /dev/null <<EOF[Unit]Description=Certificate Deploy ServiceAfter=network.target[Service]Type=simpleUser=rootExecStart=/usr/local/bin/anssl start -c /opt/anssl/config.yamlRestart=alwaysRestartSec=10[Install]WantedBy=multi-user.targetEOF
sudo systemctl daemon-reload
sudo systemctl enable anssl
sudo systemctl start anssl

RustFS 与飞牛 SSH 部署

RustFS 使用 ssl.rustFS.path 指定证书目录:未填写 SSH 主机时部署到 deploy 客户端本机;填写 SSH 主机、端口、用户名和认证字段后,部署到远程 RustFS 主机。飞牛 OS 在未配置 ssl.feiNiu 时继续使用客户端所在设备的内置部署逻辑,配置后改为 SSH 远程部署。

SSH 支持密码或私钥认证,不需要单独配置 SCP。privateKeyPath 必须指向 deploy 客户端本机上的私钥绝对路径,私钥内容不会写入 config.yaml 或发送到后端。使用私钥认证时,password 可留空,也可作为非 root 用户的 sudo 密码。

ssl:
rustFS:
path: "/opt/rustfs/tls"host: "192.168.1.30"port: 22username: "admin"privateKeyPath: "/home/anssl/.ssh/id_ed25519"privateKeyPassphrase: ""password: ""# 可选的 sudo 密码feiNiu:
host: "192.168.1.20"port: 22username: "admin"password: "your-ssh-password"

雷池 WAF 证书部署

在雷池“通用设置”中生成 API Token,并将管理端地址与 Token 配置到 deploy 客户端。连接测试只调用只读证书列表接口;部署时按新证书的完整 SAN 域名集合查找已有证书,完全一致的记录会全部更新,没有完全一致的记录时新增证书,避免误改仅部分域名重叠的证书。

ssl:
safeLine:
url: "https://waf.example.com:9443"apiToken: "your-safeline-api-token"insecureSkipVerify: false

insecureSkipVerify 默认必须保持 false。只有雷池管理端使用你明确信任的自签名 HTTPS 证书时才可开启;API Token 仅保存在 deploy 客户端本机,不会发送到 ANSSL 后端。

宝塔网站证书部署

在宝塔面板“面板设置 -> API 接口”中启用 API 并生成密钥,然后把面板地址和密钥配置到 deploy 客户端。网页端会实时读取网站及绑定域名,选择具体网站后建立自动部署目标;未启用 HTTPS 的运行中网站也可以选择,首次部署时会自动启用 HTTPS,之后部署会精确替换该网站证书。

ssl:
btPanel:
url: "https://panel.example.com:8888"apiKey: "your-bt-panel-api-key"insecureSkipVerify: false

insecureSkipVerify 仅用于你明确信任的自签名 HTTPS 面板。面板地址、真实网站 ID、API 密钥、证书私钥和面板原始诊断不会作为部署目标数据保存到 ANSSL 后端。

宝塔证书库上传

在部署目标中选择“宝塔证书库”时,deploy 会通过宝塔的 ssl/cert/save_cert 接口保存证书,不绑定具体网站。连接测试只读取证书列表;上传后会在 deploy 客户端本地回读证书详情并校验叶证书 SHA-256 指纹。

常见问题

Q: server.accessKey 在哪里获取? A: 登录 anssl.cn → 控制台 → 开发者 → API 凭证

Q: 支持哪些 Web 服务器和管理面板? A: 支持 Nginx、Apache、RustFS、1Panel、宝塔面板、雷池 WAF 和飞牛 OS 自动部署。RustFS 支持本机目录或 SSH 远程部署;飞牛部署目标默认使用客户端所在设备的内置逻辑,也可配置 ssl.feiNiu 通过 SSH 远程部署。两者都支持密码和私钥认证。

Q: 可以同时部署到多个服务吗? A: 可以。在 config.yaml 中配置所需目标(如 nginxPathapachePathrustFSonePanelbtPanelsafeLine 和可选的远程 feiNiu),并在 anssl.cn 控制台为证书选择对应部署目标。

Q: 1Panel 的 API 密钥在哪里获取? A: 登录 1Panel 面板 → 设置 → 安全 → API 接口 → 生成 API 密钥

Q: 宝塔面板的 API 密钥在哪里获取? A: 登录宝塔面板 → 面板设置 → API 接口 → 开启 API 并生成接口密钥。密钥只需填写在 deploy 客户端本机的 ssl.btPanel.apiKey

Q: 雷池的 API Token 在哪里获取? A: 登录雷池管理端 → 通用设置 → API Token。Token 只需填写在 deploy 客户端本机的 ssl.safeLine.apiToken

Q: 证书会同时部署到本地和云服务吗? A: 在 anssl.cn 控制台配置部署目标时,可以选择部署到本地 CLI(Nginx/Apache/RustFS/1Panel/宝塔面板/雷池 WAF/飞牛OS)或已接入的云服务。每个证书可以配置多个部署目标,实现同时部署。

Q: HTTP-01 验证需要手动操作吗? A: 不需要。配置好 Nginx 反向代理后,验证全程自动完成

开发

# 安装依赖
go mod download
# 运行测试
go test -v ./...
# 构建
go build -o anssl main.go

相关链接

许可证

MIT License

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

History
276 lines (197 loc) · 9.62 KB

File metadata and controls

276 lines (197 loc) · 9.62 KB

证书自动部署 CLI 工具

English README

一个自动化的 SSL 证书部署工具,用于从 anssl.cn 下载并部署证书到服务器。

特性

  • 🚀 自动化部署证书到 Nginx、Apache、RustFS、1Panel、雷池 WAF,并自动重载本地服务
  • ✅ 内置 HTTP-01 验证服务,自动响应 ACME challenge
  • ☁️ 支持阿里云、腾讯云、七牛云、华为云、火山引擎、京东云、百度云、多吉云和 LeCDN 自动部署
  • 🔧 守护进程模式,支持后台运行
  • 🖥️ 多平台支持:macOS、Linux、Windows(amd64/arm64)

快速开始

1. 安装

Linux/macOS 推荐使用一键安装脚本,默认安装 GitHub Releases 最新版本:

curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | sh

如需固定版本或修改安装目录:

curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | VERSION=v0.6.0 APP_DIR=/opt/anssl sh

默认安装到 /opt/anssl,并创建 /usr/local/bin/anssl 软链接。如需卸载:

# 卸载程序,保留配置
curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | sh -s -- --uninstall
# 卸载程序并删除配置
curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | sh -s -- --uninstall --purge

2. 配置 Nginx

添加 HTTP-01 验证反向代理(用于证书申请):

# 在 server 块中添加location~ ^/.well-known/acme-challenge/(.+)$ {proxy_passhttp://localhost:19000/acme-challenge/$1;proxy_set_header Host $host;}

重载 Nginx:

sudo nginx -t && sudo nginx -s reload

3. 运行

# 启动守护进程
sudo anssl daemon -c /opt/anssl/config.yaml
# 查看状态
anssl status
# 查看日志
anssl log -f

HTTP-01 验证工作流程

  1. 在网站申请免费证书
  2. 后端推送 ACME challenge token 到 CLI
  3. CLI 自动缓存并响应 Let's Encrypt 验证请求
  4. 验证成功,证书签发
  5. 自动下载并部署证书到配置的服务(Nginx/Apache/RustFS/1Panel/雷池 WAF/飞牛OS)
  6. 自动重载 Nginx 和 Apache 服务

全程自动化,无需手动操作。

云服务能力

云资源类部署会先从 deploy 客户端实时发现资源,部署后再回读证书状态进行验收。只有具备资源发现、证书更新和回读验收闭环的产品才会出现在控制台。

云服务Provider 名称已接入能力
阿里云aliyun上传证书、CDN、DCDN、ESA、OSS 自定义域名、CLB、ALB、NLB
腾讯云cloudTencent上传证书、CDN、EdgeOne、COS 自定义域名、CLB
七牛云qiniu上传证书、CDN、DCDN
华为云huawei上传证书、CDN、DCDN、OBS 自定义域名、ELB
火山引擎volcengine上传证书、CDN、DCDN、TOS 自定义域名、CLB、ALB、NLB
京东云jdcloud上传证书、CDN
百度云baidu上传证书、CDN
多吉云dogecloud上传证书、CDN
LeCDNlecdnCDN

京东云、百度云和多吉云当前没有注册 DCDN;LeCDN 只注册 CDN。对应产品具备完整闭环后再开放能力。

常用命令

# 守护进程管理
anssl daemon -c /opt/anssl/config.yaml # 启动守护进程
anssl status # 查看状态
anssl stop # 停止
anssl restart -c /opt/anssl/config.yaml # 重启# 日志查看
anssl log # 查看日志
anssl log -f # 实时跟踪# 更新
anssl check-update # 检查更新
anssl update # 执行更新

故障排除

HTTP-01 验证失败

# 1. 检查 Nginx 配置
sudo nginx -t
cat /etc/nginx/sites-enabled/default | grep acme-challenge
# 2. 检查端口占用
lsof -i :19000
# 3. 测试验证服务
curl http://localhost:19000/acme-challenge/test-token
# 4. 查看日志
anssl log -f

权限错误

# 方式 1:使用 sudo
sudo anssl daemon -c /opt/anssl/config.yaml
# 方式 2:配置用户目录# 修改 /opt/anssl/config.yaml: ssl.path: "$HOME/nginx/ssl"
anssl daemon -c /opt/anssl/config.yaml

开机自启动(systemd)

sudo tee /etc/systemd/system/anssl.service > /dev/null <<EOF[Unit]Description=Certificate Deploy ServiceAfter=network.target[Service]Type=simpleUser=rootExecStart=/usr/local/bin/anssl start -c /opt/anssl/config.yamlRestart=alwaysRestartSec=10[Install]WantedBy=multi-user.targetEOF
sudo systemctl daemon-reload
sudo systemctl enable anssl
sudo systemctl start anssl

RustFS 与飞牛 SSH 部署

RustFS 使用 ssl.rustFS.path 指定证书目录:未填写 SSH 主机时部署到 deploy 客户端本机;填写 SSH 主机、端口、用户名和认证字段后,部署到远程 RustFS 主机。飞牛 OS 在未配置 ssl.feiNiu 时继续使用客户端所在设备的内置部署逻辑,配置后改为 SSH 远程部署。

SSH 支持密码或私钥认证,不需要单独配置 SCP。privateKeyPath 必须指向 deploy 客户端本机上的私钥绝对路径,私钥内容不会写入 config.yaml 或发送到后端。使用私钥认证时,password 可留空,也可作为非 root 用户的 sudo 密码。

ssl:
rustFS:
path: "/opt/rustfs/tls"host: "192.168.1.30"port: 22username: "admin"privateKeyPath: "/home/anssl/.ssh/id_ed25519"privateKeyPassphrase: ""password: ""# 可选的 sudo 密码feiNiu:
host: "192.168.1.20"port: 22username: "admin"password: "your-ssh-password"

雷池 WAF 证书部署

在雷池“通用设置”中生成 API Token,并将管理端地址与 Token 配置到 deploy 客户端。连接测试只调用只读证书列表接口;部署时按新证书的完整 SAN 域名集合查找已有证书,完全一致的记录会全部更新,没有完全一致的记录时新增证书,避免误改仅部分域名重叠的证书。

ssl:
safeLine:
url: "https://waf.example.com:9443"apiToken: "your-safeline-api-token"insecureSkipVerify: false

insecureSkipVerify 默认必须保持 false。只有雷池管理端使用你明确信任的自签名 HTTPS 证书时才可开启;API Token 仅保存在 deploy 客户端本机,不会发送到 ANSSL 后端。

宝塔网站证书部署

在宝塔面板“面板设置 -> API 接口”中启用 API 并生成密钥,然后把面板地址和密钥配置到 deploy 客户端。网页端会实时读取网站及绑定域名,选择具体网站后建立自动部署目标;未启用 HTTPS 的运行中网站也可以选择,首次部署时会自动启用 HTTPS,之后部署会精确替换该网站证书。

ssl:
btPanel:
url: "https://panel.example.com:8888"apiKey: "your-bt-panel-api-key"insecureSkipVerify: false

insecureSkipVerify 仅用于你明确信任的自签名 HTTPS 面板。面板地址、真实网站 ID、API 密钥、证书私钥和面板原始诊断不会作为部署目标数据保存到 ANSSL 后端。

宝塔证书库上传

在部署目标中选择“宝塔证书库”时,deploy 会通过宝塔的 ssl/cert/save_cert 接口保存证书,不绑定具体网站。连接测试只读取证书列表;上传后会在 deploy 客户端本地回读证书详情并校验叶证书 SHA-256 指纹。

常见问题

Q: server.accessKey 在哪里获取? A: 登录 anssl.cn → 控制台 → 开发者 → API 凭证

Q: 支持哪些 Web 服务器和管理面板? A: 支持 Nginx、Apache、RustFS、1Panel、宝塔面板、雷池 WAF 和飞牛 OS 自动部署。RustFS 支持本机目录或 SSH 远程部署;飞牛部署目标默认使用客户端所在设备的内置逻辑,也可配置 ssl.feiNiu 通过 SSH 远程部署。两者都支持密码和私钥认证。

Q: 可以同时部署到多个服务吗? A: 可以。在 config.yaml 中配置所需目标(如 nginxPathapachePathrustFSonePanelbtPanelsafeLine 和可选的远程 feiNiu),并在 anssl.cn 控制台为证书选择对应部署目标。

Q: 1Panel 的 API 密钥在哪里获取? A: 登录 1Panel 面板 → 设置 → 安全 → API 接口 → 生成 API 密钥

Q: 宝塔面板的 API 密钥在哪里获取? A: 登录宝塔面板 → 面板设置 → API 接口 → 开启 API 并生成接口密钥。密钥只需填写在 deploy 客户端本机的 ssl.btPanel.apiKey

Q: 雷池的 API Token 在哪里获取? A: 登录雷池管理端 → 通用设置 → API Token。Token 只需填写在 deploy 客户端本机的 ssl.safeLine.apiToken

Q: 证书会同时部署到本地和云服务吗? A: 在 anssl.cn 控制台配置部署目标时,可以选择部署到本地 CLI(Nginx/Apache/RustFS/1Panel/宝塔面板/雷池 WAF/飞牛OS)或已接入的云服务。每个证书可以配置多个部署目标,实现同时部署。

Q: HTTP-01 验证需要手动操作吗? A: 不需要。配置好 Nginx 反向代理后,验证全程自动完成

开发

# 安装依赖
go mod download
# 运行测试
go test -v ./...
# 构建
go build -o anssl main.go

相关链接

许可证

MIT License

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History
276 lines (197 loc) · 9.62 KB

File metadata and controls

276 lines (197 loc) · 9.62 KB

证书自动部署 CLI 工具

English README

一个自动化的 SSL 证书部署工具,用于从 anssl.cn 下载并部署证书到服务器。

特性

  • 🚀 自动化部署证书到 Nginx、Apache、RustFS、1Panel、雷池 WAF,并自动重载本地服务
  • ✅ 内置 HTTP-01 验证服务,自动响应 ACME challenge
  • ☁️ 支持阿里云、腾讯云、七牛云、华为云、火山引擎、京东云、百度云、多吉云和 LeCDN 自动部署
  • 🔧 守护进程模式,支持后台运行
  • 🖥️ 多平台支持:macOS、Linux、Windows(amd64/arm64)

快速开始

1. 安装

Linux/macOS 推荐使用一键安装脚本,默认安装 GitHub Releases 最新版本:

curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | sh

如需固定版本或修改安装目录:

curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | VERSION=v0.6.0 APP_DIR=/opt/anssl sh

默认安装到 /opt/anssl,并创建 /usr/local/bin/anssl 软链接。如需卸载:

# 卸载程序,保留配置
curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | sh -s -- --uninstall
# 卸载程序并删除配置
curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | sh -s -- --uninstall --purge

2. 配置 Nginx

添加 HTTP-01 验证反向代理(用于证书申请):

# 在 server 块中添加location~ ^/.well-known/acme-challenge/(.+)$ {proxy_passhttp://localhost:19000/acme-challenge/$1;proxy_set_header Host $host;}

重载 Nginx:

sudo nginx -t && sudo nginx -s reload

3. 运行

# 启动守护进程
sudo anssl daemon -c /opt/anssl/config.yaml
# 查看状态
anssl status
# 查看日志
anssl log -f

HTTP-01 验证工作流程

  1. 在网站申请免费证书
  2. 后端推送 ACME challenge token 到 CLI
  3. CLI 自动缓存并响应 Let's Encrypt 验证请求
  4. 验证成功,证书签发
  5. 自动下载并部署证书到配置的服务(Nginx/Apache/RustFS/1Panel/雷池 WAF/飞牛OS)
  6. 自动重载 Nginx 和 Apache 服务

全程自动化,无需手动操作。

云服务能力

云资源类部署会先从 deploy 客户端实时发现资源,部署后再回读证书状态进行验收。只有具备资源发现、证书更新和回读验收闭环的产品才会出现在控制台。

云服务Provider 名称已接入能力
阿里云aliyun上传证书、CDN、DCDN、ESA、OSS 自定义域名、CLB、ALB、NLB
腾讯云cloudTencent上传证书、CDN、EdgeOne、COS 自定义域名、CLB
七牛云qiniu上传证书、CDN、DCDN
华为云huawei上传证书、CDN、DCDN、OBS 自定义域名、ELB
火山引擎volcengine上传证书、CDN、DCDN、TOS 自定义域名、CLB、ALB、NLB
京东云jdcloud上传证书、CDN
百度云baidu上传证书、CDN
多吉云dogecloud上传证书、CDN
LeCDNlecdnCDN

京东云、百度云和多吉云当前没有注册 DCDN;LeCDN 只注册 CDN。对应产品具备完整闭环后再开放能力。

常用命令

# 守护进程管理
anssl daemon -c /opt/anssl/config.yaml # 启动守护进程
anssl status # 查看状态
anssl stop # 停止
anssl restart -c /opt/anssl/config.yaml # 重启# 日志查看
anssl log # 查看日志
anssl log -f # 实时跟踪# 更新
anssl check-update # 检查更新
anssl update # 执行更新

故障排除

HTTP-01 验证失败

# 1. 检查 Nginx 配置
sudo nginx -t
cat /etc/nginx/sites-enabled/default | grep acme-challenge
# 2. 检查端口占用
lsof -i :19000
# 3. 测试验证服务
curl http://localhost:19000/acme-challenge/test-token
# 4. 查看日志
anssl log -f

权限错误

# 方式 1:使用 sudo
sudo anssl daemon -c /opt/anssl/config.yaml
# 方式 2:配置用户目录# 修改 /opt/anssl/config.yaml: ssl.path: "$HOME/nginx/ssl"
anssl daemon -c /opt/anssl/config.yaml

开机自启动(systemd)

sudo tee /etc/systemd/system/anssl.service > /dev/null <<EOF[Unit]Description=Certificate Deploy ServiceAfter=network.target[Service]Type=simpleUser=rootExecStart=/usr/local/bin/anssl start -c /opt/anssl/config.yamlRestart=alwaysRestartSec=10[Install]WantedBy=multi-user.targetEOF
sudo systemctl daemon-reload
sudo systemctl enable anssl
sudo systemctl start anssl

RustFS 与飞牛 SSH 部署

RustFS 使用 ssl.rustFS.path 指定证书目录:未填写 SSH 主机时部署到 deploy 客户端本机;填写 SSH 主机、端口、用户名和认证字段后,部署到远程 RustFS 主机。飞牛 OS 在未配置 ssl.feiNiu 时继续使用客户端所在设备的内置部署逻辑,配置后改为 SSH 远程部署。

SSH 支持密码或私钥认证,不需要单独配置 SCP。privateKeyPath 必须指向 deploy 客户端本机上的私钥绝对路径,私钥内容不会写入 config.yaml 或发送到后端。使用私钥认证时,password 可留空,也可作为非 root 用户的 sudo 密码。

ssl:
rustFS:
path: "/opt/rustfs/tls"host: "192.168.1.30"port: 22username: "admin"privateKeyPath: "/home/anssl/.ssh/id_ed25519"privateKeyPassphrase: ""password: ""# 可选的 sudo 密码feiNiu:
host: "192.168.1.20"port: 22username: "admin"password: "your-ssh-password"

雷池 WAF 证书部署

在雷池“通用设置”中生成 API Token,并将管理端地址与 Token 配置到 deploy 客户端。连接测试只调用只读证书列表接口;部署时按新证书的完整 SAN 域名集合查找已有证书,完全一致的记录会全部更新,没有完全一致的记录时新增证书,避免误改仅部分域名重叠的证书。

ssl:
safeLine:
url: "https://waf.example.com:9443"apiToken: "your-safeline-api-token"insecureSkipVerify: false

insecureSkipVerify 默认必须保持 false。只有雷池管理端使用你明确信任的自签名 HTTPS 证书时才可开启;API Token 仅保存在 deploy 客户端本机,不会发送到 ANSSL 后端。

宝塔网站证书部署

在宝塔面板“面板设置 -> API 接口”中启用 API 并生成密钥,然后把面板地址和密钥配置到 deploy 客户端。网页端会实时读取网站及绑定域名,选择具体网站后建立自动部署目标;未启用 HTTPS 的运行中网站也可以选择,首次部署时会自动启用 HTTPS,之后部署会精确替换该网站证书。

ssl:
btPanel:
url: "https://panel.example.com:8888"apiKey: "your-bt-panel-api-key"insecureSkipVerify: false

insecureSkipVerify 仅用于你明确信任的自签名 HTTPS 面板。面板地址、真实网站 ID、API 密钥、证书私钥和面板原始诊断不会作为部署目标数据保存到 ANSSL 后端。

宝塔证书库上传

在部署目标中选择“宝塔证书库”时,deploy 会通过宝塔的 ssl/cert/save_cert 接口保存证书,不绑定具体网站。连接测试只读取证书列表;上传后会在 deploy 客户端本地回读证书详情并校验叶证书 SHA-256 指纹。

常见问题

Q: server.accessKey 在哪里获取? A: 登录 anssl.cn → 控制台 → 开发者 → API 凭证

Q: 支持哪些 Web 服务器和管理面板? A: 支持 Nginx、Apache、RustFS、1Panel、宝塔面板、雷池 WAF 和飞牛 OS 自动部署。RustFS 支持本机目录或 SSH 远程部署;飞牛部署目标默认使用客户端所在设备的内置逻辑,也可配置 ssl.feiNiu 通过 SSH 远程部署。两者都支持密码和私钥认证。

Q: 可以同时部署到多个服务吗? A: 可以。在 config.yaml 中配置所需目标(如 nginxPathapachePathrustFSonePanelbtPanelsafeLine 和可选的远程 feiNiu),并在 anssl.cn 控制台为证书选择对应部署目标。

Q: 1Panel 的 API 密钥在哪里获取? A: 登录 1Panel 面板 → 设置 → 安全 → API 接口 → 生成 API 密钥

Q: 宝塔面板的 API 密钥在哪里获取? A: 登录宝塔面板 → 面板设置 → API 接口 → 开启 API 并生成接口密钥。密钥只需填写在 deploy 客户端本机的 ssl.btPanel.apiKey

Q: 雷池的 API Token 在哪里获取? A: 登录雷池管理端 → 通用设置 → API Token。Token 只需填写在 deploy 客户端本机的 ssl.safeLine.apiToken

Q: 证书会同时部署到本地和云服务吗? A: 在 anssl.cn 控制台配置部署目标时,可以选择部署到本地 CLI(Nginx/Apache/RustFS/1Panel/宝塔面板/雷池 WAF/飞牛OS)或已接入的云服务。每个证书可以配置多个部署目标,实现同时部署。

Q: HTTP-01 验证需要手动操作吗? A: 不需要。配置好 Nginx 反向代理后,验证全程自动完成

开发

# 安装依赖
go mod download
# 运行测试
go test -v ./...
# 构建
go build -o anssl main.go

相关链接

许可证

MIT License

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History
276 lines (197 loc) · 9.62 KB

File metadata and controls

276 lines (197 loc) · 9.62 KB

证书自动部署 CLI 工具

English README

一个自动化的 SSL 证书部署工具,用于从 anssl.cn 下载并部署证书到服务器。

特性

  • 🚀 自动化部署证书到 Nginx、Apache、RustFS、1Panel、雷池 WAF,并自动重载本地服务
  • ✅ 内置 HTTP-01 验证服务,自动响应 ACME challenge
  • ☁️ 支持阿里云、腾讯云、七牛云、华为云、火山引擎、京东云、百度云、多吉云和 LeCDN 自动部署
  • 🔧 守护进程模式,支持后台运行
  • 🖥️ 多平台支持:macOS、Linux、Windows(amd64/arm64)

快速开始

1. 安装

Linux/macOS 推荐使用一键安装脚本,默认安装 GitHub Releases 最新版本:

curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | sh

如需固定版本或修改安装目录:

curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | VERSION=v0.6.0 APP_DIR=/opt/anssl sh

默认安装到 /opt/anssl,并创建 /usr/local/bin/anssl 软链接。如需卸载:

# 卸载程序,保留配置
curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | sh -s -- --uninstall
# 卸载程序并删除配置
curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | sh -s -- --uninstall --purge

2. 配置 Nginx

添加 HTTP-01 验证反向代理(用于证书申请):

# 在 server 块中添加location~ ^/.well-known/acme-challenge/(.+)$ {proxy_passhttp://localhost:19000/acme-challenge/$1;proxy_set_header Host $host;}

重载 Nginx:

sudo nginx -t && sudo nginx -s reload

3. 运行

# 启动守护进程
sudo anssl daemon -c /opt/anssl/config.yaml
# 查看状态
anssl status
# 查看日志
anssl log -f

HTTP-01 验证工作流程

  1. 在网站申请免费证书
  2. 后端推送 ACME challenge token 到 CLI
  3. CLI 自动缓存并响应 Let's Encrypt 验证请求
  4. 验证成功,证书签发
  5. 自动下载并部署证书到配置的服务(Nginx/Apache/RustFS/1Panel/雷池 WAF/飞牛OS)
  6. 自动重载 Nginx 和 Apache 服务

全程自动化,无需手动操作。

云服务能力

云资源类部署会先从 deploy 客户端实时发现资源,部署后再回读证书状态进行验收。只有具备资源发现、证书更新和回读验收闭环的产品才会出现在控制台。

云服务Provider 名称已接入能力
阿里云aliyun上传证书、CDN、DCDN、ESA、OSS 自定义域名、CLB、ALB、NLB
腾讯云cloudTencent上传证书、CDN、EdgeOne、COS 自定义域名、CLB
七牛云qiniu上传证书、CDN、DCDN
华为云huawei上传证书、CDN、DCDN、OBS 自定义域名、ELB
火山引擎volcengine上传证书、CDN、DCDN、TOS 自定义域名、CLB、ALB、NLB
京东云jdcloud上传证书、CDN
百度云baidu上传证书、CDN
多吉云dogecloud上传证书、CDN
LeCDNlecdnCDN

京东云、百度云和多吉云当前没有注册 DCDN;LeCDN 只注册 CDN。对应产品具备完整闭环后再开放能力。

常用命令

# 守护进程管理
anssl daemon -c /opt/anssl/config.yaml # 启动守护进程
anssl status # 查看状态
anssl stop # 停止
anssl restart -c /opt/anssl/config.yaml # 重启# 日志查看
anssl log # 查看日志
anssl log -f # 实时跟踪# 更新
anssl check-update # 检查更新
anssl update # 执行更新

故障排除

HTTP-01 验证失败

# 1. 检查 Nginx 配置
sudo nginx -t
cat /etc/nginx/sites-enabled/default | grep acme-challenge
# 2. 检查端口占用
lsof -i :19000
# 3. 测试验证服务
curl http://localhost:19000/acme-challenge/test-token
# 4. 查看日志
anssl log -f

权限错误

# 方式 1:使用 sudo
sudo anssl daemon -c /opt/anssl/config.yaml
# 方式 2:配置用户目录# 修改 /opt/anssl/config.yaml: ssl.path: "$HOME/nginx/ssl"
anssl daemon -c /opt/anssl/config.yaml

开机自启动(systemd)

sudo tee /etc/systemd/system/anssl.service > /dev/null <<EOF[Unit]Description=Certificate Deploy ServiceAfter=network.target[Service]Type=simpleUser=rootExecStart=/usr/local/bin/anssl start -c /opt/anssl/config.yamlRestart=alwaysRestartSec=10[Install]WantedBy=multi-user.targetEOF
sudo systemctl daemon-reload
sudo systemctl enable anssl
sudo systemctl start anssl

RustFS 与飞牛 SSH 部署

RustFS 使用 ssl.rustFS.path 指定证书目录:未填写 SSH 主机时部署到 deploy 客户端本机;填写 SSH 主机、端口、用户名和认证字段后,部署到远程 RustFS 主机。飞牛 OS 在未配置 ssl.feiNiu 时继续使用客户端所在设备的内置部署逻辑,配置后改为 SSH 远程部署。

SSH 支持密码或私钥认证,不需要单独配置 SCP。privateKeyPath 必须指向 deploy 客户端本机上的私钥绝对路径,私钥内容不会写入 config.yaml 或发送到后端。使用私钥认证时,password 可留空,也可作为非 root 用户的 sudo 密码。

ssl:
rustFS:
path: "/opt/rustfs/tls"host: "192.168.1.30"port: 22username: "admin"privateKeyPath: "/home/anssl/.ssh/id_ed25519"privateKeyPassphrase: ""password: ""# 可选的 sudo 密码feiNiu:
host: "192.168.1.20"port: 22username: "admin"password: "your-ssh-password"

雷池 WAF 证书部署

在雷池“通用设置”中生成 API Token,并将管理端地址与 Token 配置到 deploy 客户端。连接测试只调用只读证书列表接口;部署时按新证书的完整 SAN 域名集合查找已有证书,完全一致的记录会全部更新,没有完全一致的记录时新增证书,避免误改仅部分域名重叠的证书。

ssl:
safeLine:
url: "https://waf.example.com:9443"apiToken: "your-safeline-api-token"insecureSkipVerify: false

insecureSkipVerify 默认必须保持 false。只有雷池管理端使用你明确信任的自签名 HTTPS 证书时才可开启;API Token 仅保存在 deploy 客户端本机,不会发送到 ANSSL 后端。

宝塔网站证书部署

在宝塔面板“面板设置 -> API 接口”中启用 API 并生成密钥,然后把面板地址和密钥配置到 deploy 客户端。网页端会实时读取网站及绑定域名,选择具体网站后建立自动部署目标;未启用 HTTPS 的运行中网站也可以选择,首次部署时会自动启用 HTTPS,之后部署会精确替换该网站证书。

ssl:
btPanel:
url: "https://panel.example.com:8888"apiKey: "your-bt-panel-api-key"insecureSkipVerify: false

insecureSkipVerify 仅用于你明确信任的自签名 HTTPS 面板。面板地址、真实网站 ID、API 密钥、证书私钥和面板原始诊断不会作为部署目标数据保存到 ANSSL 后端。

宝塔证书库上传

在部署目标中选择“宝塔证书库”时,deploy 会通过宝塔的 ssl/cert/save_cert 接口保存证书,不绑定具体网站。连接测试只读取证书列表;上传后会在 deploy 客户端本地回读证书详情并校验叶证书 SHA-256 指纹。

常见问题

Q: server.accessKey 在哪里获取? A: 登录 anssl.cn → 控制台 → 开发者 → API 凭证

Q: 支持哪些 Web 服务器和管理面板? A: 支持 Nginx、Apache、RustFS、1Panel、宝塔面板、雷池 WAF 和飞牛 OS 自动部署。RustFS 支持本机目录或 SSH 远程部署;飞牛部署目标默认使用客户端所在设备的内置逻辑,也可配置 ssl.feiNiu 通过 SSH 远程部署。两者都支持密码和私钥认证。

Q: 可以同时部署到多个服务吗? A: 可以。在 config.yaml 中配置所需目标(如 nginxPathapachePathrustFSonePanelbtPanelsafeLine 和可选的远程 feiNiu),并在 anssl.cn 控制台为证书选择对应部署目标。

Q: 1Panel 的 API 密钥在哪里获取? A: 登录 1Panel 面板 → 设置 → 安全 → API 接口 → 生成 API 密钥

Q: 宝塔面板的 API 密钥在哪里获取? A: 登录宝塔面板 → 面板设置 → API 接口 → 开启 API 并生成接口密钥。密钥只需填写在 deploy 客户端本机的 ssl.btPanel.apiKey

Q: 雷池的 API Token 在哪里获取? A: 登录雷池管理端 → 通用设置 → API Token。Token 只需填写在 deploy 客户端本机的 ssl.safeLine.apiToken

Q: 证书会同时部署到本地和云服务吗? A: 在 anssl.cn 控制台配置部署目标时,可以选择部署到本地 CLI(Nginx/Apache/RustFS/1Panel/宝塔面板/雷池 WAF/飞牛OS)或已接入的云服务。每个证书可以配置多个部署目标,实现同时部署。

Q: HTTP-01 验证需要手动操作吗? A: 不需要。配置好 Nginx 反向代理后,验证全程自动完成

开发

# 安装依赖
go mod download
# 运行测试
go test -v ./...
# 构建
go build -o anssl main.go

相关链接

许可证

MIT License

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

History
276 lines (197 loc) · 9.62 KB

File metadata and controls

276 lines (197 loc) · 9.62 KB

证书自动部署 CLI 工具

English README

一个自动化的 SSL 证书部署工具,用于从 anssl.cn 下载并部署证书到服务器。

特性

  • 🚀 自动化部署证书到 Nginx、Apache、RustFS、1Panel、雷池 WAF,并自动重载本地服务
  • ✅ 内置 HTTP-01 验证服务,自动响应 ACME challenge
  • ☁️ 支持阿里云、腾讯云、七牛云、华为云、火山引擎、京东云、百度云、多吉云和 LeCDN 自动部署
  • 🔧 守护进程模式,支持后台运行
  • 🖥️ 多平台支持:macOS、Linux、Windows(amd64/arm64)

快速开始

1. 安装

Linux/macOS 推荐使用一键安装脚本,默认安装 GitHub Releases 最新版本:

curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | sh

如需固定版本或修改安装目录:

curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | VERSION=v0.6.0 APP_DIR=/opt/anssl sh

默认安装到 /opt/anssl,并创建 /usr/local/bin/anssl 软链接。如需卸载:

# 卸载程序,保留配置
curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | sh -s -- --uninstall
# 卸载程序并删除配置
curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/https-cert/deploy/main/scripts/install.sh | sh -s -- --uninstall --purge

2. 配置 Nginx

添加 HTTP-01 验证反向代理(用于证书申请):

# 在 server 块中添加location~ ^/.well-known/acme-challenge/(.+)$ {proxy_passhttp://localhost:19000/acme-challenge/$1;proxy_set_header Host $host;}

重载 Nginx:

sudo nginx -t && sudo nginx -s reload

3. 运行

# 启动守护进程
sudo anssl daemon -c /opt/anssl/config.yaml
# 查看状态
anssl status
# 查看日志
anssl log -f

HTTP-01 验证工作流程

  1. 在网站申请免费证书
  2. 后端推送 ACME challenge token 到 CLI
  3. CLI 自动缓存并响应 Let's Encrypt 验证请求
  4. 验证成功,证书签发
  5. 自动下载并部署证书到配置的服务(Nginx/Apache/RustFS/1Panel/雷池 WAF/飞牛OS)
  6. 自动重载 Nginx 和 Apache 服务

全程自动化,无需手动操作。

云服务能力

云资源类部署会先从 deploy 客户端实时发现资源,部署后再回读证书状态进行验收。只有具备资源发现、证书更新和回读验收闭环的产品才会出现在控制台。

云服务Provider 名称已接入能力
阿里云aliyun上传证书、CDN、DCDN、ESA、OSS 自定义域名、CLB、ALB、NLB
腾讯云cloudTencent上传证书、CDN、EdgeOne、COS 自定义域名、CLB
七牛云qiniu上传证书、CDN、DCDN
华为云huawei上传证书、CDN、DCDN、OBS 自定义域名、ELB
火山引擎volcengine上传证书、CDN、DCDN、TOS 自定义域名、CLB、ALB、NLB
京东云jdcloud上传证书、CDN
百度云baidu上传证书、CDN
多吉云dogecloud上传证书、CDN
LeCDNlecdnCDN

京东云、百度云和多吉云当前没有注册 DCDN;LeCDN 只注册 CDN。对应产品具备完整闭环后再开放能力。

常用命令

# 守护进程管理
anssl daemon -c /opt/anssl/config.yaml # 启动守护进程
anssl status # 查看状态
anssl stop # 停止
anssl restart -c /opt/anssl/config.yaml # 重启# 日志查看
anssl log # 查看日志
anssl log -f # 实时跟踪# 更新
anssl check-update # 检查更新
anssl update # 执行更新

故障排除

HTTP-01 验证失败

# 1. 检查 Nginx 配置
sudo nginx -t
cat /etc/nginx/sites-enabled/default | grep acme-challenge
# 2. 检查端口占用
lsof -i :19000
# 3. 测试验证服务
curl http://localhost:19000/acme-challenge/test-token
# 4. 查看日志
anssl log -f

权限错误

# 方式 1:使用 sudo
sudo anssl daemon -c /opt/anssl/config.yaml
# 方式 2:配置用户目录# 修改 /opt/anssl/config.yaml: ssl.path: "$HOME/nginx/ssl"
anssl daemon -c /opt/anssl/config.yaml

开机自启动(systemd)

sudo tee /etc/systemd/system/anssl.service > /dev/null <<EOF[Unit]Description=Certificate Deploy ServiceAfter=network.target[Service]Type=simpleUser=rootExecStart=/usr/local/bin/anssl start -c /opt/anssl/config.yamlRestart=alwaysRestartSec=10[Install]WantedBy=multi-user.targetEOF
sudo systemctl daemon-reload
sudo systemctl enable anssl
sudo systemctl start anssl

RustFS 与飞牛 SSH 部署

RustFS 使用 ssl.rustFS.path 指定证书目录:未填写 SSH 主机时部署到 deploy 客户端本机;填写 SSH 主机、端口、用户名和认证字段后,部署到远程 RustFS 主机。飞牛 OS 在未配置 ssl.feiNiu 时继续使用客户端所在设备的内置部署逻辑,配置后改为 SSH 远程部署。

SSH 支持密码或私钥认证,不需要单独配置 SCP。privateKeyPath 必须指向 deploy 客户端本机上的私钥绝对路径,私钥内容不会写入 config.yaml 或发送到后端。使用私钥认证时,password 可留空,也可作为非 root 用户的 sudo 密码。

ssl:
rustFS:
path: "/opt/rustfs/tls"host: "192.168.1.30"port: 22username: "admin"privateKeyPath: "/home/anssl/.ssh/id_ed25519"privateKeyPassphrase: ""password: ""# 可选的 sudo 密码feiNiu:
host: "192.168.1.20"port: 22username: "admin"password: "your-ssh-password"

雷池 WAF 证书部署

在雷池“通用设置”中生成 API Token,并将管理端地址与 Token 配置到 deploy 客户端。连接测试只调用只读证书列表接口;部署时按新证书的完整 SAN 域名集合查找已有证书,完全一致的记录会全部更新,没有完全一致的记录时新增证书,避免误改仅部分域名重叠的证书。

ssl:
safeLine:
url: "https://waf.example.com:9443"apiToken: "your-safeline-api-token"insecureSkipVerify: false

insecureSkipVerify 默认必须保持 false。只有雷池管理端使用你明确信任的自签名 HTTPS 证书时才可开启;API Token 仅保存在 deploy 客户端本机,不会发送到 ANSSL 后端。

宝塔网站证书部署

在宝塔面板“面板设置 -> API 接口”中启用 API 并生成密钥,然后把面板地址和密钥配置到 deploy 客户端。网页端会实时读取网站及绑定域名,选择具体网站后建立自动部署目标;未启用 HTTPS 的运行中网站也可以选择,首次部署时会自动启用 HTTPS,之后部署会精确替换该网站证书。

ssl:
btPanel:
url: "https://panel.example.com:8888"apiKey: "your-bt-panel-api-key"insecureSkipVerify: false

insecureSkipVerify 仅用于你明确信任的自签名 HTTPS 面板。面板地址、真实网站 ID、API 密钥、证书私钥和面板原始诊断不会作为部署目标数据保存到 ANSSL 后端。

宝塔证书库上传

在部署目标中选择“宝塔证书库”时,deploy 会通过宝塔的 ssl/cert/save_cert 接口保存证书,不绑定具体网站。连接测试只读取证书列表;上传后会在 deploy 客户端本地回读证书详情并校验叶证书 SHA-256 指纹。

常见问题

Q: server.accessKey 在哪里获取? A: 登录 anssl.cn → 控制台 → 开发者 → API 凭证

Q: 支持哪些 Web 服务器和管理面板? A: 支持 Nginx、Apache、RustFS、1Panel、宝塔面板、雷池 WAF 和飞牛 OS 自动部署。RustFS 支持本机目录或 SSH 远程部署;飞牛部署目标默认使用客户端所在设备的内置逻辑,也可配置 ssl.feiNiu 通过 SSH 远程部署。两者都支持密码和私钥认证。

Q: 可以同时部署到多个服务吗? A: 可以。在 config.yaml 中配置所需目标(如 nginxPathapachePathrustFSonePanelbtPanelsafeLine 和可选的远程 feiNiu),并在 anssl.cn 控制台为证书选择对应部署目标。

Q: 1Panel 的 API 密钥在哪里获取? A: 登录 1Panel 面板 → 设置 → 安全 → API 接口 → 生成 API 密钥

Q: 宝塔面板的 API 密钥在哪里获取? A: 登录宝塔面板 → 面板设置 → API 接口 → 开启 API 并生成接口密钥。密钥只需填写在 deploy 客户端本机的 ssl.btPanel.apiKey

Q: 雷池的 API Token 在哪里获取? A: 登录雷池管理端 → 通用设置 → API Token。Token 只需填写在 deploy 客户端本机的 ssl.safeLine.apiToken

Q: 证书会同时部署到本地和云服务吗? A: 在 anssl.cn 控制台配置部署目标时,可以选择部署到本地 CLI(Nginx/Apache/RustFS/1Panel/宝塔面板/雷池 WAF/飞牛OS)或已接入的云服务。每个证书可以配置多个部署目标,实现同时部署。

Q: HTTP-01 验证需要手动操作吗? A: 不需要。配置好 Nginx 反向代理后,验证全程自动完成

开发

# 安装依赖
go mod download
# 运行测试
go test -v ./...
# 构建
go build -o anssl main.go

相关链接

许可证

MIT License