# License 部署参数清单
YMS(`glory-ymswell`)与 LMS(`glory-lms`)联调/上线时,需配置以下环境变量(或等价 YAML 配置项)。
## 必需参数
| 环境变量 | 作用 | YMS | LMS | 说明 |
|---------|------|-----|-----|------|
| `YMS_MACHINE_CODE_SECRET` | machineCode HMAC 密钥 | ✅ | ✅ | **两端必须完全一致**,否则 LMS 无法解码 YMS 机器码 |
| `YMS_LICENSE_PUBLIC_KEY_PEM` | RSA 公钥 PEM | ✅ | — | YMS 验签用;与 LMS 私钥成对 |
| `LMS_LICENSE_PRIVATE_KEY_PEM` | RSA 私钥 PEM | — | ✅ | LMS 签发 `.lic` 用;**勿下发到客户环境** |
## 可选参数
| 环境变量 / 配置项 | 默认值 | 说明 |
|------------------|--------|-----------------------|
| `yms.license.storage-dir` | `${user.home}/ymswell/license` | YMS 导入后 license 落盘目录 |
| `yms.license.storage-filename` | `license.lic` | YMS license 文件名 |
| `lms.license.storage-dir` | `${user.home}/ymswell/lms-license` | LMS 签发记录与 `.lic` 存储目录 |
## 密钥生成(一次性)
```powershell
Set-Location "D:\Work1-idea\glorysoft\glory-lms"
.\scripts\generate-rsa-keys.ps1 -OutDir ".\keys"
```
生成文件:
- `keys/lms_private.pem` → 注入 `LMS_LICENSE_PRIVATE_KEY_PEM`(仅 LMS 服务器)
- `keys/yms_public.pem` → 注入 `YMS_LICENSE_PUBLIC_KEY_PEM`(YMS 服务器,可随安装包内置)
## 运行时示例(PowerShell)
```powershell
$env:YMS_MACHINE_CODE_SECRET = "replace-with-strong-shared-secret"
$env:LMS_LICENSE_PRIVATE_KEY_PEM = (Get-Content -Raw ".\keys\lms_private.pem")
$env:YMS_LICENSE_PUBLIC_KEY_PEM = (Get-Content -Raw ".\keys\yms_public.pem")
```
## 发版检查清单
- [ ] `YMS_MACHINE_CODE_SECRET` 已在 YMS、LMS 两端配置且一致
- [ ] YMS 已配置与 LMS 私钥匹配的 `YMS_LICENSE_PUBLIC_KEY_PEM`
- [ ] LMS 私钥未提交到代码仓库、未打包进 YMS 安装包
- [ ] 生产环境已替换默认 machine-code-secret(`ymswell-machine-code-secret-change-me`)
- [ ] 联调脚本 `README-LICENSE-E2E.md` / `api-test.http` 全流程通过
## 接口速查
| 系统 | 接口 | 说明 |
|------|------|----------------------------------|
| YMS | `GET /yms/license/hardware` | 获取 machineCode |
| YMS | `POST /yms/license/import` | 导入 `.lic` |
| YMS | `GET /yms/license/info` | 查询授权信息 |
| YMS | `GET /yms/license/status` | 是否已授权 |
| LMS | `POST /lms/license/decode-machine-code` | 解码 machineCode |
| LMS | `POST /lms/license/generate` | 签发 license(body 含 `productCode`) |
| LMS | `POST /lms/license/list/query` | 分页筛选列表 |
| LMS | `GET /lms/license/download/{id}` | 下载 `.lic` |
## License 载荷字段(当前版本)
```json
{
"productCode": "YMSwell",
"customerName": "华封",
"machineCode": "...",
"issuedAt": "2026年06月23日T08:00:00Z",
"expiresAt": "2027年12月31日T23:59:59Z",
"maxOnlineUsers": 200
}
```
签名算法:`RSA-SHA256`(canonical JSON,属性按字母序排列)。