首页 ›前端开发 ›web应用

小陈-SSL管家 · 使用说明

tts小陈 发布于 2026-09-28 14:50 更新于 2026-09-28 阅读 29 约 4,867 字 · 阅读 13 分钟
web应用 ·

版本 4.9.x | 适用于单机部署(宝塔 / 自建 LNMP 均可) 平台定位:SSL 证书代签 / 转售的一站式托管 —— 签发、续签、部署到客户服务器、到期提醒,全流程自动化。


1. 平台能做什么

能力 说明
一键签发 提交域名(单域名 / 泛域名 / 多域名),通过 ACME(Let's Encrypt)签发 90 天证书
自动续签 到期前 30 天平台自动续签(每日巡检),网站全程无感
自动部署 新证书自动推送到客户服务器并重载 Nginx,三种通道可选(见 §6)
部署自检 平台对客户站点做真实 TLS 握手验证,部署是否成功一目了然
告警通知 签发失败 / 即将到期 / 部署失败 / 服务器失联,企业微信 / 邮件推送
开放 API 客户可用令牌自助拉取证书、回执部署结果

客户的全部操作只有三件:① 永久加一条 CNAME 解析;② 装一次自动部署(或对接宝塔);③ 之后什么都不用做。


2. 环境要求与安装

2.1 服务器要求

  • PHP 8.x(需启用 exec / shell_exec / putenv、openssl、curl 扩展)
  • MySQL 5.7+(库名 / 账号建议与站点同名,便于识别)
  • Nginx(宝塔环境自带;自建需可执行 nginx -t 与 reload)
  • 出网正常(需访问 Let's Encrypt 与 DNS 服务商 API)

2.2 安装步骤

  1. 上传代码到站点目录,配置 config.php(数据库连接、APP_NAME、ACME_HOME、验证域等)。
  2. 浏览器访问任意页面 —— 所有数据表自动创建,后续升级的新表 / 新列也会自动迁移,无需手工 SQL。
  3. 用默认管理员登录:admin / admin123(登录后立即改密码)。
  4. 进入「系统设置」:
    • 开启开放 API(自动部署与 API 功能的前提);
    • 配置 DNS 服务商凭据(如阿里云 AccessKey,存放于 data/dns.env,0600 权限)。
  5. 配置续签巡检 cron(关键!不配就不会自动续签):
0 3 * * * su -s /bin/sh www -c "php /www/wwwroot/你的站点/cron/renew.php"

⚠️ 必须以 www 身份运行(与 Web 进程一致)。root 身份运行会造成 acme 目录属主撕裂,导致后续续签报 Permission denied(平台已内置 fixPerms() 自愈,但仍建议口径统一)。


3. 快速上手(管理员)

  1. 客户管理 → 新建客户(或生成邀请码让客户自助注册)。
  2. 域名管理 → 添加域名,归属到客户,填写服务期等售卖信息。
  3. 对域名发起签发:
    • 通用场景:客户在 DNS 里加一条永久 CNAME:_acme-challenge.客户域名 → 验证域(验证域见系统设置,如 auth.zeiot.net);
    • 便捷场景:客户域名与平台在同一 DNS 账号(如都在你的阿里云里)时,免 CNAME 直接签。
  4. 签发完成(约 1 分钟),证书进入「证书下载」,客户即可部署。
  5. 引导客户开启自动部署(§6),之后续签自动换新。

4. 管理员功能一览

菜单 用途
总览 域名 / 证书 / 客户概况,近期动态
客户管理 客户增删改、查看登录记录(弹窗固定显示最近 6 条)
域名管理 域名、SAN、状态、所属客户;支持按"客户显示名"搜索
续签日志 每次签发 / 续签的完整记录与失败原因
续费看板 按服务期查看续费节奏(日历视图)
部署看板 各域名自动部署通道、最近签到 / 部署结果、失联清单、手动巡检
运营健康 存量证书到期分布、失败率等运营指标
审计中心 域名变更 / 账号登录 / 操作留痕;管理员账号统一显示「管理员」
告警通知 企微 / 邮件配置、事件开关、模板自定义、测试发送
客服设置 用户端在线客服代码
邀请码 生成注册邀请码(含可签配额)
系统设置 开放 API 开关、验证域、DNS 凭据等
数据备份 数据库备份下载

4.1 两步验证(2FA)

  • 管理员可在「两步验证」页用验证器 App(Google Authenticator 等)开启 TOTP。
  • 登录验证码页可勾选「记住本设备 7 天」:7 天内该设备登录只输密码(天数由 TRUST_DEVICE_DAYS 配置,0 = 关闭此功能)。
  • 「已记住的设备」卡片可单台 / 全部撤销;改密码或关闭 2FA 会自动撤销全部信任设备。
  • 验证码连错 5 次锁定 5 分钟。

5. 客户端功能一览

菜单 用途
总览 名下域名与证书状态
我的域名 域名列表、服务期
自助申请 凭邀请码配额提交申请(默认泛域名类型)
证书下载 下载 zip / nginx 拼接格式 / 各类单独文件;下载留痕
部署自检 真实 TLS 握手检测任意名下域名(含证书链、有效期、是否本平台证书)
自动部署 三通道配置与部署记录(§6)
API 接口 令牌管理、接口说明(默认折叠)

域名状态:pending 待申请 → issued 已签发 → 约 60 天时自动续签 → 循环;失败会记录原因并告警。


6. 自动部署(三种通道)

三条通道可并存,按客户环境选;平台默认按「宝塔 → 接收端」顺序自动分派推送。

6.1 方式一 · agent 自查(拉模式,通用性最强)

客户在服务器执行一条命令(平台页面一键生成):

curl -fsSL "https://平台域名/index.php?m=agent&p=install" | sudo sh -s -- \
  --token=<部署令牌> --domain=abc.com --check=分钟数 --api="https://平台域名/index.php?m=api"
  • 安装到 /opt/ssl-agent/,自动识别站点证书路径(宝塔优先),装好计划任务后完全免维护。
  • 自查频率:默认半个月(每月 1、16 号);可选 5 分钟 ~ 15 天(安全上限:必须明显小于 30 天的提前续签期,超限服务端自动夹取)。改频率 = 重新生成命令再执行一次。
  • 工作逻辑:读本机证书指纹 → 与平台比对 → 一致直接退出(零下载) → 不一致才下载 → 备份旧证书 → 替换 → nginx -t 通过才 reload,不通过自动回滚 → 回执平台 → 平台做 TLS 握手自检。
  • 多域名:安装命令可重复执行追加域名;删除 /opt/ssl-agent/sites.d/对应.conf 即停用该域名。
  • 状态 6 种:未安装 / 待首次运行 / 运行中 / 上次失败 / 长期未签到 / 已停用。

6.2 方式二 · 宝塔面板 API(宝塔客户首选,秒级生效)

客户操作:宝塔面板 → 面板设置 → API 接口 → 开启并把平台服务器 IP 加入白名单,拿到 api_sk。

平台用户端填:面板地址 + API 密钥 + 站点名 → 先点「测试连接并保存」(返回面板版本即通)→ 「立即推送」验证。

  • 平台通过官方签名调用 /site?action=SetSSL 部署证书,宝塔写完自动重载 Nginx,客户服务器零安装。
  • 主路径失败自动回退(SaveCert + SetSSL type=1);两条都失败时如实报错不谎报成功。
  • api_sk 等同于面板管理权:平台侧 AES-256-GCM 加密存储、页面只回显末 4 位;客户换密钥需重新填写。

6.3 方式三 · 接收端文件(非宝塔且有 PHP 环境时用)

  1. 下载接收端(平台页面给出命令): curl -fsSL "https://平台域名/index.php?m=agent&p=receive" -o /www/wwwroot/你的站点/ssl-receive.php
  2. 改文件顶部配置区:粘贴推送令牌、按实际路径填 $TARGETS(证书 / 私钥路径、校验与重载命令)。
  3. 平台保存接收端地址 + 令牌 → 域名行出现「自检页」链接(已带令牌),打开看到「已就绪」即通。
  4. (若走收件箱模式)安装 root 搬运脚本:curl -fsSL "https://平台域名/index.php?m=agent&p=receive_inbox" -o /root/ssl-inbox-deploy.sh,改其中 INBOX 为实际路径,加 cron 每 5 分钟。

安全设计:

  • 来源域名白名单(下载时自动填平台域名,不暴露 IP)+ 可选 IP 白名单;
  • 请求不能指定任何路径,写哪里完全由接收端本地配置决定;令牌常量时间比较;
  • 目标可写 → 直接替换秒级生效;不可写(宝塔 root 属主)→ 证书收进站点内 .ssl-inbox/(nginx 拒绝访问 . 开头目录),由 root 脚本搬运,指纹幂等(同一张不重复重载);
  • 自检页同样受令牌保护(v1.4+):不带 / 带错令牌一律返回 nginx 样式 404,扫描者探测不到文件;
  • 本地接收日志 .ssl-receive.log 文件头带退出指令,浏览器无法直读。

6.4 通道怎么选

环境 推荐
宝塔面板 方式二(零安装、秒级)
自建 Nginx / 有 PHP 方式一(最省心)或方式三(要秒级)
无 PHP 环境 方式一(只依赖 shell + curl)

7. 自动续签机制

  • 证书有效期 90 天;平台每日巡检(cron/renew.php),到期前 30 天自动续签。
  • 续签成功后:按配置的通道自动推送 / 等待 agent 自查替换 → 部署后自动 TLS 自检 → 全程留痕。
  • 续签失败:记录原因、触发告警,下轮巡检重试。
  • 客户域名 CNAME 是永久性的一次配置,续签无需客户参与。

8. 开放 API

  • 认证:请求头 Authorization: Bearer <令牌>,或 ?token=<令牌> 兜底(部分 Nginx 不传授权头)。
  • 限流:每令牌 60 次 / 分钟。管理员账号不能持有令牌(仅客户账号可创建)。
  • 端点:
端点 说明
GET ?m=api&p=ping 连通性测试
GET ?m=api&p=me 当前令牌信息与配额
GET ?m=api&p=domains 名下域名与证书状态、剩余天数
GET ?m=api&p=cert&id=<id>&f=zip\|nginx\|json 下载证书包
GET ?m=api&p=deploy_check&domain=&fp= agent 用:比对指纹,返回是否需要更新
POST ?m=api&p=deploy_report agent 用:回执部署结果

9. 告警通知

  • 渠道:企业微信机器人 / SMTP 邮件,均支持测试发送。
  • 事件开关:签发失败、临近到期、续签成功、自动部署失败、服务器长期未签到(后两项默认开)。
  • 模板可自定义,支持 {域名}{剩余天数}{失败原因}{客户} 等占位符。
  • 失联判定:按通道自查频率自动推导(2 个周期 + 2 天缓冲),也可在部署看板手动设定。
  • 每日巡检自动清理过期信任设备与过期部署记录。

10. 升级与维护

  • 增量包升级:解压覆盖站点目录即可 —— config.php、data/、pages/auth.landing.php(首页)不在包内,客户数据与手改内容不受影响;新表 / 新列自动迁移;升级后可选手工改 config.php 的 APP_VERSION(纯显示)。
  • 首页:pages/auth.landing.php 为可手改文件,升级不会覆盖;缺省时自动回退到内置默认版。
  • 备份:升级前建议用「数据备份」导出一次;data/ 目录含证书与 ACME 账户,属核心资产。

11. 常见问题

Q:客户每年要做什么? 什么都不用做。CNAME 是永久配置,续签、部署、提醒全部自动;除非换了服务器 / 证书路径,才需要重新跑一次安装命令。

Q:自查频率选多快合适? 推荐半个月(默认)。平台提前 30 天续签,半个月自查最坏也有 15 天余量;不要超过 15 天。没更新时 agent 只做一次指纹比对,开销可忽略。

Q:为什么部署自检显示「可访问(非本平台证书)」? 说明该域名能 HTTPS 访问,但平台没有可比亚对的证书(可能还没在平台申请,或证书文件已被清理)。

Q:宝塔环境接收端报 open_basedir 错误? v1.4+ 接收端不再跨目录读写:证书收进站点内 .ssl-inbox/,由 root 脚本搬运,无需改 PHP 配置。

Q:2FA 验证码不对? 检查手机时间(容差 ±30 秒);连错 5 次锁 5 分钟。忘记密钥可让管理员重置账号。

Q:agent 显示「长期未签到」? 多为计划任务被删或服务器失联:登服务器检查 crontab -l 是否还有 ssl-agent/agent.sh 行,或重跑一次安装命令。

Q:忘了管理员密码? 通过数据库重置 users 表对应账号的 password 字段(password_hash() 生成),或重建管理员。


文档对应版本 4.9.2(2026-09-28)。平台各页面的即时提示(如安装命令、令牌)以页面实际输出为准。

💬 留言 共 0 条 · 登录后可留言
还没有留言,来抢沙发~
在线客服
在线客服二维码
微信扫码 · 联系在线客服
收起