modify: 台账更改插件
This commit is contained in:
+527
@@ -0,0 +1,527 @@
|
||||
# chongming 机器码授权工具 · 使用手册
|
||||
|
||||
面向**商务、售后、技术支持**同事。不需要懂命令行,也不需要懂密码学 ——
|
||||
照着本手册做,就能把客户设备的"申请码"变成一份能用的授权文件。
|
||||
|
||||
> 本手册讲**怎么用**。授权是怎么验的、私钥为什么不能外传、设备端强制执行点在哪,
|
||||
> 见仓库 [README](../README.md);界面是怎么设计的见 [界面设计.md](界面设计.md)。
|
||||
|
||||
---
|
||||
|
||||
## 1. 三十秒认识这个工具
|
||||
|
||||
**它做什么**:把客户设备导出的**申请码**,变成一份 `license_*.lic` 授权文件。
|
||||
|
||||
**它不做什么**:不联网、不连设备、不装东西 —— 全程在你自己的电脑上离线完成。
|
||||
客户设备那边只需要做两件事:导出申请码给你、导入你发回的 `.lic`。
|
||||
|
||||
| | 使用者 | 在哪 | 能不能签发 |
|
||||
| --- | --- | --- | --- |
|
||||
| **本工具** | 厂商(商务/售后/研发) | 桌面软件 | ✅ 需要私钥 |
|
||||
| `chongming-license` 命令行 | 厂商(研发/自动化) | 终端 | ✅ 需要私钥 |
|
||||
| 设备端「授权」页 | 客户 / 现场装机 | 浏览器 `http://<设备IP>:8000/static/license` | ❌ 只能导出申请码、导入 license |
|
||||
|
||||
> ⚠️ **两件事必须记住**
|
||||
> 1. **私钥只在本机**,绝不随部署产物、安装包、邮件分发。私钥泄漏 = 任何人都能签发授权。
|
||||
> 2. 本工具是**厂商侧**工具,装在你的办公电脑上,不要给客户。
|
||||
|
||||
---
|
||||
|
||||
## 2. 三步上手
|
||||
|
||||
### 第一步:准备私钥(只做一次)
|
||||
|
||||
打开「**密钥**」页,点「**生成密钥对**」。
|
||||
|
||||

|
||||
|
||||
- 私钥会写到你指定的路径(默认 `license_private.pem`),**离线备份到 U 盘/密码管理器**。
|
||||
- 公钥会自动复制到剪贴板 —— 下一步"把公钥注入设备"就要用它。
|
||||
- 记住页面上显示的**公钥指纹**(形如 `3F9A-1C2B-…`)。之后每次签发前都核对一眼,
|
||||
能避免"拿错密钥签了一批授权"这种最难排查的事故。
|
||||
|
||||
如果公司已经有一把私钥(比如研发那边统一管理),用下半部分「**加载现有私钥**」选中它即可。
|
||||
|
||||
### 第二步:让客户导出申请码
|
||||
|
||||
告诉客户(或现场同事)在设备上打开 `http://<设备IP>:8000/static/license`,
|
||||
点「导出申请码」,把那一串 `CM1-…` 复制给你(微信/邮件都行,**可以带换行和空格**)。
|
||||
|
||||
> 客户回传**申请码**而不是机器码:机器码是哈希,反推不出各个硬件标识,
|
||||
> 只能签出"精确匹配、换硬件即失效"的授权;申请码带完整指纹,才能享受换硬件容错。
|
||||
|
||||
### 第三步:签发
|
||||
|
||||
打开「**签发**」页,粘贴申请码 → 点「解析申请码」→ 勾选要授权的插件 →
|
||||
填客户名 → 点「**签发并保存…**」。
|
||||
|
||||

|
||||
|
||||
把生成的 `.lic` 文件发给客户,让他在设备「授权」页导入并**重启网关**即可生效。
|
||||
|
||||
---
|
||||
|
||||
## 3. 页面详解
|
||||
|
||||
### 3.1 签发页
|
||||
|
||||
日常最高频的操作。设计目标是:**在你按下"签发"之前**,就能看清"给谁、哪台设备、哪些插件、多久"。
|
||||
|
||||
#### 签名私钥
|
||||
|
||||
| 字段 | 含义 | 怎么填 |
|
||||
| --- | --- | --- |
|
||||
| 当前 | 正在生效的私钥文件 | 显示路径;未加载时会提示去「密钥」页 |
|
||||
| 公钥指纹 | 这把私钥对应公钥的短指纹 | 签发前**核对它**与设备端显示的一致 |
|
||||
|
||||
#### 签发依据(三选一)
|
||||
|
||||
| 方式 | 什么时候用 | 容错能力 |
|
||||
| --- | --- | --- |
|
||||
| **申请码**(推荐) | 绝大多数情况 | ✅ 换网卡/换 eMMC 不影响授权 |
|
||||
| 来源 JSON 文件 | 客户/研发给了 `show --json` 的导出文件 | ✅ 同上 |
|
||||
| 仅机器码 | 实在拿不到申请码,客户只报了机器码 | ❌ 精确匹配,**换一块网卡就失授权** |
|
||||
|
||||
选「申请码」后:把 `CM1-…` 粘进输入框 → 点「**解析申请码**」。
|
||||
下方会显示:
|
||||
|
||||
- **解析结果**:机器码 + 指纹来源统计。若出现 ⚠(没有任何可信来源 / 无来源指纹),
|
||||
整块文字会变成警示色 —— 这是签发前最该被看见的信息。
|
||||
- **来源指纹**:逐条列出这台设备的硬件标识。
|
||||
|
||||
> **可信来源 / weak 来源是什么?**
|
||||
> 授权按"多个硬件指纹里命中若干个"来判定,而不是全中才算。
|
||||
> `machine_id`(systemd machine-id)被标为 **weak**:同一个系统镜像刷到不同机器上会重复,
|
||||
> 让它计票等于给"整盘拷贝到另一台机器"白送一票,所以**它不参与判定**,只作参考。
|
||||
|
||||
#### 授权插件
|
||||
|
||||
勾选这台设备上要生效的插件。
|
||||
|
||||
- 列表会**自动读取**你填的「项目根」目录下 `config/workers/*/config.toml`,列出该项目实际有哪些插件。
|
||||
- 读不到时会退回到常见候选,并在列表下方用警示色写明"已用常见候选"—— 别把它当成真实清单。
|
||||
- 也可以手工输入任意插件 type 后点「添加」。
|
||||
- 设备上装了但**没被勾选**的插件,导入授权后会被拒绝加载。
|
||||
|
||||
#### 授权信息
|
||||
|
||||
| 字段 | 含义 | 怎么填 |
|
||||
| --- | --- | --- |
|
||||
| 客户名称 | 写给谁,台账检索靠它 | 建议统一格式,如"华东水务集团" |
|
||||
| 授权编号 | license 的唯一编号 | **留空自动生成**(`L<日期>-<随机>`),一般不用手填 |
|
||||
| 备注 | 合同号等,仅展示/审计 | 如 `合同 SM-2026-0417` |
|
||||
| 密钥标识 | 写进 license 的 `kid` 字段 | 可选,如 `vendor-2026` |
|
||||
| 有效期 | N 天 / 指定到期日 / 永久有效 | 三选一;未选中的输入框会自动禁用 |
|
||||
|
||||
#### 预览与签发
|
||||
|
||||
- **预览**里是即将被签名的完整载荷 JSON —— 与真正签名用的是**同一个对象**,所见即所签。
|
||||
按「刷新预览」随时核对。
|
||||
- 「签发后记入台账」默认勾选,建议保持:台账存了机器指纹,**下次续期不用再找客户要申请码**。
|
||||
- 点「**签发并保存…**」选择保存位置 → 完成。
|
||||
|
||||
> 签发完会再弹一张回执确认:编号、客户、机器码、插件、有效期、公钥指纹。
|
||||
> 把 `.lic` 发给客户前,建议扫一眼这张回执。
|
||||
|
||||
### 3.2 台账页
|
||||
|
||||
已签发授权的检索与管理。**签发页签发的每一份都会自动入库**。
|
||||
|
||||

|
||||
|
||||
#### 台账库
|
||||
|
||||
| 字段 | 说明 |
|
||||
| --- | --- |
|
||||
| 存储 | **本地 SQLite**(默认,单文件)或 **PostgreSQL**(团队共用一份,见 [4.9](#49-团队共用台账postgresql)) |
|
||||
| 路径(本地) | 台账库文件位置,默认 `~/.chongming/licenses.db`(单文件 SQLite,直接拷走即备份) |
|
||||
| 连接(PostgreSQL) | 连接串摘要 + 「连接设置…」,**不显示密码** |
|
||||
| 概览 | 总数 + 有效 / 即将到期 / 已过期 / 永久 / 未生效 / 当前筛选数 |
|
||||
| 签名私钥 | 续期要用私钥;未加载时会提示去「密钥」页 |
|
||||
|
||||
首次指定一个不存在的路径 → 点「打开 / 新建」即可创建空台账。
|
||||
选 PostgreSQL 时点「打开 / 新建」建立连接(首次会自动建表)。
|
||||
|
||||
#### 筛选
|
||||
|
||||
客户(模糊)、机器码(模糊、大小写不敏感)、插件 type(精确)、
|
||||
关键字(同时匹配编号/机器码/客户/备注)、状态、以及「即将到期」的判定窗口(默认 30 天)。
|
||||
|
||||
列表按**到期日升序**,最急的排在最前。
|
||||
|
||||
| 状态 | 含义 | 颜色 |
|
||||
| --- | --- | --- |
|
||||
| 未生效 | 生效日期还没到 | 紫 |
|
||||
| 已过期 | 到期日已过 | 红 |
|
||||
| 即将到期 | 在判定窗口内(默认 30 天内) | 橙 |
|
||||
| 有效 | 正常可用 | 绿 |
|
||||
| 永久有效 | 无到期日 | 蓝 |
|
||||
|
||||
> 判定顺序是"未生效 → 永久 → 已过期 → 即将到期 → 有效"。
|
||||
> 所以一份"生效日期在未来"的授权即使同时填了过去的到期日,也显示为**未生效**。
|
||||
|
||||
#### 行操作
|
||||
|
||||
| 按钮 | 作用 |
|
||||
| --- | --- |
|
||||
| **续期选中…** | 打开续期对话框:只改要变的部分,**直接复用台账里的机器指纹,无需再向客户索取申请码** |
|
||||
| **改插件…** | 重签一份只换了插件白名单的新授权:**有效期与生效日原样保留**,指纹同样复用台账 |
|
||||
| 编辑备注 | 人工批注("已电话确认续期"、"设备已返修")。**重新导入 license 不会覆盖它** |
|
||||
| 复制机器码 | 复制选中行的机器码 |
|
||||
| 查看详情 | 摘要 + **当初签发的那份 license 原始内容**,可直接复制 |
|
||||
| 删除记录 | 只删台账记录,**不影响已经发给客户的 .lic**(那些文件仍然有效) |
|
||||
|
||||
**续期对话框**长这样:
|
||||
|
||||

|
||||
|
||||
- 上半部分是**原授权**(只读),下半部分是**新授权**(可改)。
|
||||
- 编号默认「生成新授权编号」:新旧两条都留在台账,可追溯;需要沿用原编号也可以切换。
|
||||
- 旧记录会自动加上 `已续期 → <新编号>` 批注。
|
||||
|
||||
**改插件对话框**用于"客户说设备上少了一个插件能用"这类需求:
|
||||
|
||||

|
||||
|
||||
- 顶部「原授权」是只读摘要(编号 / 客户 / 机器码 / 有效期 / 指纹个数),
|
||||
下面的勾选列表与签发页是同一个组件:项目里 `config/workers` 下的插件自动列出,
|
||||
原来授权过的插件**始终留在列表里并预勾选**(哪怕项目里已经删掉那个插件),
|
||||
找不到的 type 还可以手工添加。
|
||||
- 列表下方「变更」一行实时显示 `新增:… / 移除:…`。
|
||||
**移除**的插件会额外亮出告警:客户导入新文件后该插件会被拒载(`plugin_not_licensed`)。
|
||||
- **有效期与生效日原样保留**(这一条是刻意的:要延长有效期请用「续期选中…」)。
|
||||
- 编号默认「生成新授权编号」,旧记录会自动加上 `已变更插件 → <新编号>` 批注;
|
||||
选「沿用原授权编号」则替换台账里那份记录(审计追溯只剩新版,一般不建议)。
|
||||
|
||||
> **为什么不能直接改文件?** 授权文件是签名过的,签名覆盖整个载荷 —— 改任何一个字段
|
||||
> (包括插件白名单)都会让签名失效,只能**用私钥重签一份新的**。
|
||||
> 另外授权**没有吊销机制**:旧 `.lic` 在它自己的到期日之前仍然有效,
|
||||
> 只能靠客户导入新文件把它们覆盖掉。所以改插件本质上是"再发一份授权"。
|
||||
|
||||
#### 导出归档
|
||||
|
||||
- **导出 .lic**:把当前筛选结果原样导出,文件名形如 `L20260921-312629_3ECA-D113-….lic`;
|
||||
可选「按客户分子目录」,直接打包发给对应客户。
|
||||
- **导出 CSV 清单**:给商务对账用,UTF-8 BOM 编码,Excel 双击打开**中文不乱码**。
|
||||
|
||||
### 3.3 密钥页
|
||||
|
||||
见 [第一步](#第一步准备私钥只做一次)。补充说明:
|
||||
|
||||
| 字段 | 说明 |
|
||||
| --- | --- |
|
||||
| 私钥保存到 | 生成密钥对时的写入路径 |
|
||||
| 公钥 base64 | 可直接填进设备配置 `[license] public_key` 的那一行,点「复制」取走 |
|
||||
| 公钥 PEM | 另一种格式(`-----BEGIN PUBLIC KEY-----`),按需使用 |
|
||||
| 加载现有私钥 | 选中已有私钥后显示对应公钥与指纹,用来确认"这把私钥对应哪把公钥" |
|
||||
|
||||
### 3.4 查看 / 校验页
|
||||
|
||||
拿到一份 `.lic`(比如客户反馈"导入失败",或你要发货前自检)时用这一页。
|
||||
|
||||

|
||||
|
||||
| 区域 | 说明 |
|
||||
| --- | --- |
|
||||
| license 文件 | 选或填 `.lic` 路径 |
|
||||
| 公钥 | 验签用的公钥(base64 或 PEM);**留空则只查看内容、不验签** |
|
||||
| 指纹比对基准 | **按本机**(在你自己电脑上通常对不上,属正常)/**按指定机器**(填客户申请码) |
|
||||
| 校验结论 | 成功/失败横幅 + 原因码 + 命中与不匹配的来源明细 |
|
||||
| 内容 | license 的完整 JSON |
|
||||
|
||||
> **发货前自检的正确做法**:选「按指定机器」并填入**客户设备的申请码**。
|
||||
> 只验签名只能证明"这文件是我们签的",验不出"是不是给这台设备签的"。
|
||||
> 填了申请码,工具才会真正核对机器指纹。
|
||||
|
||||
校验失败时长这样(下面是"拿 A 设备的授权去校 B 设备"):
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
## 4. 场景速查
|
||||
|
||||
### 4.1 第一次给一台新设备签发
|
||||
|
||||
「密钥」页确认私钥已加载并记下指纹 → 客户导出申请码 → 「签发」页解析申请码 →
|
||||
勾选插件 → 填客户名与有效期 → 签发并保存 → 把 `.lic` 发给客户导入 → 重启网关。
|
||||
|
||||
### 4.2 设备续期(客户联系不上、或换人对接)
|
||||
|
||||
「台账」页搜到那台设备(按客户名或机器码)→ 选中 → 「**续期选中…**」→
|
||||
选有效期 → 「续期并保存…」。
|
||||
|
||||
**全程不需要再找客户要申请码** —— 续期复用台账里存的指纹。这是台账最大的价值。
|
||||
|
||||
### 4.3 客户换了网卡 / 主板,提示授权失效
|
||||
|
||||
授权是按"多个硬件指纹命中若干"判定的,阈值是 **3 个可信来源**:
|
||||
|
||||
- 换一块网卡 → 少一票(网卡 MAC 不匹配),其余仍命中 → **通常仍可用**。
|
||||
- 换了主板或整机返修后主板序列号变了 → 可能跌破阈值 → 需要**续期/重新签发**。
|
||||
|
||||
做法同 4.2:从台账复用指纹重新签发一份。注意换了几件硬件后可能连台账里的旧指纹也
|
||||
不足以命中,此时请让客户**重新导出申请码**,按 4.1 走一遍。
|
||||
|
||||
### 4.4 发货前自检
|
||||
|
||||
「查看 / 校验」页 → 选刚签发的 `.lic` → 填公钥 → 选「按指定机器」→ 粘贴**这台设备**的申请码 → 点「校验」。
|
||||
看到绿色「✓ 授权有效」再发货。
|
||||
|
||||
### 4.5 查某客户的所有授权
|
||||
|
||||
「台账」页 → 客户框填客户名(模糊匹配)→ 「查询」。
|
||||
|
||||
### 4.6 批量交付 / 归档
|
||||
|
||||
「台账」页 → 筛选出要交付的范围 → 「导出」区选目录 → 「导出 .lic」→
|
||||
需要按客户分包就选「按客户分子目录」。
|
||||
|
||||
对账要表格时用「导出 CSV 清单」。
|
||||
|
||||
### 4.7 换电脑 / 密钥交接
|
||||
|
||||
1. 在新电脑上装好本工具(见 [README](../README.md) 的安装与运行)。
|
||||
2. 把**私钥文件**从安全备份中取回,放到新电脑(不要走微信/邮件)。
|
||||
3. 「密钥」页 →「加载现有私钥」→ 选中它 → **核对公钥指纹与之前记录的一致**。
|
||||
4. 台账库默认在 `~/.chongming/licenses.db`,一并拷到新电脑对应位置;
|
||||
或在「台账」页「浏览…」指向拷过来的库文件。
|
||||
|
||||
### 4.8 调整"即将到期"的判定窗口
|
||||
|
||||
「台账」页 →「状态」行右侧的「__ 天内」改成你要的值(比如 90)→ 点「查询」。
|
||||
之后「只看即将到期」也按这个窗口筛选。
|
||||
|
||||
### 4.9 团队共用台账(PostgreSQL)
|
||||
|
||||
默认每人的台账是**自己电脑上的单文件**,互相看不见。若希望商务/售后/研发看到
|
||||
**同一份台账**(谁签给了谁、哪台设备快到期,不用互相问),可以改成共用一个
|
||||
PostgreSQL 库。**这是可选功能**:没配就还是本地 SQLite,不影响使用。
|
||||
|
||||
#### 一次性准备(找 IT / DBA)
|
||||
|
||||
1. 准备一个 PostgreSQL 库(版本 12+ 即可,公司内网直连最省事)。
|
||||
2. 建一个账号,日常使用给 `SELECT / INSERT / UPDATE / DELETE` 权限即可;
|
||||
若允许建表,工具**首次连接会自动建表**,无需人工干预。
|
||||
3. 如果账号**没有建表权限**,把仓库里的 `docs/pg_schema.sql` 交给 DBA 执行一次
|
||||
(里面就是表 + 索引 + 版本表)。
|
||||
|
||||
#### 每台电脑上的配置
|
||||
|
||||
「台账」页 →「存储」改成 **PostgreSQL** → 点「连接设置…」:
|
||||
|
||||
| 字段 | 怎么填 |
|
||||
| --- | --- |
|
||||
| 主机 / 端口 | 数据库地址,PostgreSQL 默认端口 **5432** |
|
||||
| 数据库 | 库名 |
|
||||
| 用户 / 密码 | 上一步建的账号 |
|
||||
| SSL 模式 | 内网直连常用 `prefer`;要求加密选 `require` |
|
||||
| Schema | 默认 `public`,除非 DBA 指定了别的 |
|
||||
| **记住密码** | 勾选后写入本机配置,下次启动自动连接(**明文保存**,见下方提醒) |
|
||||
|
||||
不确定填得对不对,先点「**测试连接**」—— 它会真的连一次并告诉你结果。
|
||||
保存后用「打开 / 新建」建立连接,「概览」显示记录数即成功。
|
||||
|
||||
#### 密码怎么存(请想清楚再勾)
|
||||
|
||||
- **不勾「记住密码」**(推荐给安全要求高的环境):密码只存在于本次运行的内存里。
|
||||
关掉工具再打开需要重新输入;签发时若未连接,会在"记入台账"环节提示去连接。
|
||||
- **勾了「记住密码」**:密码明文保存在本机(Windows 是注册表
|
||||
`HKCU\Software\chongming\license-gui`),下次启动自动连接。
|
||||
共享电脑、或数据库账号权限较大的场合**不要勾**。取消勾选会删除已保存的密码。
|
||||
|
||||
> 说明:工具的既有约定是"配置里只记路径、不记内容"(私钥就是这么处理的)。
|
||||
> 这里之所以提供"记住密码",是因为每天手输数据库密码对商务同事门槛太高 ——
|
||||
> 但默认是**不勾**,由你自己权衡。
|
||||
|
||||
#### 多个同事同时用会不会冲突?
|
||||
|
||||
不会。PostgreSQL 本身支持并发,多人同时签发/续期/查询都安全(本地 SQLite 版同样
|
||||
支持多开窗口)。同一份授权被两人同时写入时按授权编号幂等覆盖。
|
||||
|
||||
#### 常见问题
|
||||
|
||||
**「连接设置…」测试连接失败?**
|
||||
按提示依次确认:主机端口是否可达(能不能 ping 通、5432 是否放通)、库名对不对、
|
||||
账号密码、以及 PostgreSQL 的 `pg_hba.conf` 是否允许你这台机器的 IP 连接。
|
||||
|
||||
**提示"建表失败"?**
|
||||
账号没有建表权限。把 `docs/pg_schema.sql` 交给 DBA 执行一次,之后就能正常用。
|
||||
|
||||
**提示"台账库结构版本为 X,本程序支持 Y"?**
|
||||
这个库是另一个版本的工具建的。先导出台账(export),再换用匹配版本的工具;
|
||||
不要手工改版本号。
|
||||
|
||||
**换回本地台账?**
|
||||
「存储」改回「本地 SQLite」→「打开 / 新建」。本地库里的数据一直都在,不会因为
|
||||
用过 PostgreSQL 而丢失。切后端时工具会断开当前连接,避免"界面显示一个库、
|
||||
实际写另一个库"。
|
||||
|
||||
**切了 PostgreSQL 后,签发时提示记台账失败?**
|
||||
说明当时没连上(多半是没勾"记住密码",本次运行还没连接过)。授权文件已经正常
|
||||
生成,不影响交付;到「台账」页连一下即可,或重新签发一次(会幂等入库)。
|
||||
|
||||
---
|
||||
|
||||
## 5. 常见问题(FAQ)
|
||||
|
||||
**Q:签发页显示的公钥指纹,和设备端不一致?**
|
||||
说明两边用的不是同一把密钥 —— 设备固件里内置的公钥不是你手上这把私钥对应的公钥。
|
||||
用**正确的私钥**签发,或请研发把对应公钥注入构建产物(`CHONGMING_LICENSE_PUBKEY`
|
||||
环境变量或 `license_public.key` 文件)。签出来的授权在这种设备上一定会验签失败。
|
||||
|
||||
**Q:台账是空的 / 台账库打不开?**
|
||||
台账是你**本机**的记录,不会从别处同步。默认路径 `~/.chongming/licenses.db`,
|
||||
若该文件不存在,点「打开 / 新建」会创建一个空台账。
|
||||
若提示"结构版本为 X,本程序支持 Y",说明这个库是另一个版本的工具建的 ——
|
||||
先用匹配版本导出,或换用对应版本的工具。
|
||||
|
||||
**Q:申请码解析失败?**
|
||||
- 确认是 `CM1-` 开头、三段式、没被截断(提示"校验和不符"就是抄漏了)。
|
||||
- 让客户重新导出一次再发;换行和空格没问题,工具会自动清理。
|
||||
|
||||
**Q:插件列表读不到本项目插件?**
|
||||
「项目根」要指向项目根目录(该目录下应有 `config/workers/*/config.toml`)。
|
||||
点「重新加载插件列表」重试;仍读不到时会用常见候选并提示,此时请**手工添加**实际插件 type。
|
||||
|
||||
**Q:提示"已签发但记入台账失败"?**
|
||||
授权文件**已经正常生成**,只是没记进台账。通常是台账库路径不可写或文件被占用。
|
||||
到「台账」页检查「台账库」路径是否可写,然后手工把这份 `.lic` 补录:签发时不用重签,
|
||||
用「查看 / 校验」确认文件没问题即可,只是这次要在台账里补一条(或下次签发给同一台设备时自然会入库)。
|
||||
|
||||
**Q:客户导入后仍然提示未授权?**
|
||||
按顺序排查:
|
||||
1. 公钥指纹是否一致(见上);
|
||||
2. 「查看 / 校验」页选「按指定机器」填客户申请码,看结论与原因码(见[附录 A](#附录-a校验原因码全表));
|
||||
3. 设备上的插件 type 是否在授权白名单内(授权插件勾选齐全了吗);
|
||||
4. 设备是否**重启过网关**(导入后需重启生效);
|
||||
5. 设备系统时间是否被改早过(会触发时钟防线)。
|
||||
|
||||
**Q:导出的 CSV 用 Excel 打开中文乱码?**
|
||||
本工具导出的 CSV 带 UTF-8 BOM,双击不会乱码。若你另存/转存过,可能丢失了 BOM ——
|
||||
重新从「导出 CSV 清单」导出一次即可。
|
||||
|
||||
**Q:误删了台账记录怎么办?**
|
||||
记录删了就是删了(不影响已发出去的授权文件)。只要那份 `.lic` 还在客户或你手里,
|
||||
可以到「签发」页按新客户重新签发,或在「查看 / 校验」页确认文件有效后手工补录台账。
|
||||
**建议定期备份 `licenses.db`**(单文件,拷走即可)。
|
||||
|
||||
**Q:一份 license 能给多台设备用吗?**
|
||||
不能。授权绑定的是机器指纹。多台设备请各签一份(批量场景建议走命令行脚本化)。
|
||||
|
||||
**Q:能改一份已经发出去的授权的有效期吗?**
|
||||
不能改,只能**重新签发**一份新的(用「续期」或重新签发),再让客户导入覆盖。
|
||||
旧的 `.lic` 在到期日之前仍然有效。
|
||||
|
||||
**Q:能改一份已经发出去的授权的授权插件吗?**
|
||||
也不能改文件本身 —— 授权文件是签名过的,改了签名就失效。正确做法是**重签**:
|
||||
台账页选中那条 →「改插件…」,勾好新白名单后另存一份新 `.lic` 交给客户导入。
|
||||
有效期与生效日会**原样保留**,只有白名单变;旧文件在它自己的到期日之前仍然有效
|
||||
(授权没有吊销机制,只能靠客户导入新文件覆盖)。
|
||||
|
||||
**Q:台账库能直接拷走 / 备份吗?**
|
||||
可以。它是单文件 SQLite,直接复制 `licenses.db` 即可;恢复时拷回原位置或在「台账」页指向它。
|
||||
|
||||
**Q:同时开两个窗口操作台账安全吗?**
|
||||
安全。台账库用 WAL 模式并设了等待超时,可以多开窗口。
|
||||
|
||||
**Q:私钥文件的权限真的被保护了吗?**
|
||||
在 Linux/macOS 上私钥写为 `0600`(仅本人可读写)。**Windows 没有 POSIX 权限位**,
|
||||
chmod 不生效 —— Windows 上请把私钥放在只有你能访问的目录(例如个人目录而非共享盘),
|
||||
并依赖磁盘加密与账号权限保护。
|
||||
|
||||
---
|
||||
|
||||
## 6. 安全须知
|
||||
|
||||
| 事项 | 要求 |
|
||||
| --- | --- |
|
||||
| 私钥存放 | 只放厂商机器;**离线备份**(U 盘 / 密码管理器 / 保险柜) |
|
||||
| 私钥分发 | ❌ 绝不进 Git、不进安装包、不进部署产物、不走即时通讯 |
|
||||
| 私钥丢失 | 无法再签发新授权(已发出去的授权不受影响,直到到期) |
|
||||
| 私钥泄漏 | 任何人都能签发有效授权 —— 等同于授权体系失效,需更换密钥对并重新部署公钥 |
|
||||
| 本工具本身 | 厂商侧工具,**不随部署产物分发** |
|
||||
| 公钥 | 可以公开,需要注入到设备构建产物中 |
|
||||
|
||||
**本工具记住了什么**(存于系统配置,方便连续签发):
|
||||
私钥**路径**、客户名、备注、密钥标识、默认天数、项目根目录、台账库路径、导出目录、校验用公钥。
|
||||
**不会记住私钥内容本身。**
|
||||
|
||||
---
|
||||
|
||||
## 7. 术语表
|
||||
|
||||
| 术语 | 含义 |
|
||||
| --- | --- |
|
||||
| **机器码** | 由设备硬件指纹算出的短标识,形如 `BC60-D20E-F863-7236-68E2-6A24`(24 位十六进制,4 位一组)。单向哈希,反推不出原始指纹 |
|
||||
| **申请码** | `CM1-…` 开头的一段文本,包含设备**各来源的原始指纹**。首次申请授权时请客户回传它 |
|
||||
| **来源指纹** | 设备的各项硬件标识(主板序列号、eMMC CID、CPU 序列号、网卡 MAC、DMI product_uuid、systemd machine-id) |
|
||||
| **weak 来源** | 同镜像刷机会重复的标识(`machine_id`),**不参与判定**,仅作参考 |
|
||||
| **公钥指纹** | 公钥的短摘要(16 位十六进制),用来"一眼确认用的是哪把密钥" |
|
||||
| **kid** | 密钥标识,写在 license 里便于区分签发批次 |
|
||||
| **台账** | 本机记录已签发授权的 SQLite 库,可用于续期时复用机器指纹 |
|
||||
| **license / .lic** | 签发给客户的授权文件(JSON 格式,含载荷与 Ed25519 签名) |
|
||||
|
||||
---
|
||||
|
||||
## 8. 与命令行的对应关系
|
||||
|
||||
| 本工具的操作 | 等价命令行 |
|
||||
| --- | --- |
|
||||
| 密钥 → 生成密钥对 | `chongming-license keygen` |
|
||||
| 密钥 → 加载私钥(看公钥/指纹) | `chongming-license keygen` 输出 / `inspect --key` |
|
||||
| 签发 → 签发并保存 | `chongming-license issue` |
|
||||
| 查看 / 校验 → 仅查看内容 | `chongming-license inspect` |
|
||||
| 查看 / 校验 → 校验(按指定机器) | `chongming-license verify --request-code` |
|
||||
| 台账 → 详情面板 | `chongming-license verify` |
|
||||
| 台账 → 续期 / 导出 | CLI 的 `registry` 相关子命令 |
|
||||
| 台账 → 改插件 | `chongming-license issue`(`--plugins` 换白名单,机器码与日期照抄台账) |
|
||||
|
||||
**批量签发(一次几十台)建议直接用 CLI 脚本化**;本工具面向单台/少量、
|
||||
需要人工核对信息的场景。
|
||||
|
||||
---
|
||||
|
||||
## 附录 A:校验原因码全表
|
||||
|
||||
「查看 / 校验」页的「原因码」字段取值与含义:
|
||||
|
||||
| 原因码 | 含义 | 怎么办 |
|
||||
| --- | --- | --- |
|
||||
| `ok` | 授权有效 | 正常 |
|
||||
| `license_missing` | 未找到授权文件 | 检查设备上 license 文件路径 |
|
||||
| `license_malformed` | 授权文件格式错误或内容损坏 | 传输中损坏,重新发送 |
|
||||
| `signature_invalid` | 签名校验失败(可能被篡改或非本厂商签发) | 核对公钥指纹;确认是本工具签发的 |
|
||||
| `unsupported_alg` | 用了不支持的签名算法 | 授权文件版本不对,重新签发 |
|
||||
| `no_public_key` | 设备未配置厂商公钥,无法校验 | 请研发把公钥注入构建产物 |
|
||||
| `machine_mismatch` | 机器码不匹配(不是为本机签发的) | 用**这台设备**的申请码重新签发 |
|
||||
| `not_yet_valid` | 授权尚未生效 | 到了生效日期会自动生效 |
|
||||
| `expired` | 授权已过期 | 续期 |
|
||||
| `clock_rollback` | 检测到系统时间被回拨,校验中止 | 校正设备时间后重启网关 |
|
||||
| `plugin_not_licensed` | 该插件不在授权白名单内 | 重新签发并勾选该插件 |
|
||||
| `fingerprint_unavailable` | 本机无法采集硬件指纹 | 设备环境异常,联系研发 |
|
||||
| `disabled` | 授权校验未启用(开发/测试模式) | 仅开发/测试环境会出现 |
|
||||
|
||||
## 附录 B:授权状态对照
|
||||
|
||||
| 状态 | 判定条件(按优先级) |
|
||||
| --- | --- |
|
||||
| 未生效 | 生效日期 > 今天 |
|
||||
| 永久有效 | 没有到期日 |
|
||||
| 已过期 | 到期日 < 今天 |
|
||||
| 即将到期 | 到期日 ≤ 今天 + 判定窗口(默认 30 天) |
|
||||
| 有效 | 其余情况 |
|
||||
|
||||
## 附录 C:机器指纹来源
|
||||
|
||||
| 来源 | 说明 | 是否参与判定 |
|
||||
| --- | --- | --- |
|
||||
| `board_serial` | 主板序列号(设备树/DMI) | ✅ |
|
||||
| `emmc_cid` | eMMC 芯片 CID | ✅ |
|
||||
| `cpu_serial` | CPU 序列号 | ✅ |
|
||||
| `mac` | 物理网卡 MAC(字典序最小那块) | ✅ |
|
||||
| `product_uuid` | DMI product_uuid | ✅ |
|
||||
| `machine_id` | systemd machine-id | ❌ weak,仅参考 |
|
||||
|
||||
判定规则:只比对 license 与本机**都有**的来源,命中数 ≥ **3** 即认定同一台设备
|
||||
(双方都只有 weak 来源时会降级纳入判定并在结论里告警)。
|
||||
Reference in New Issue
Block a user