# license-suite **Repository Path**: MathMiner/license-suite ## Basic Information - **Project Name**: license-suite - **Description**: license校验服务 包含宿主机 包含docker容器内 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-26 - **Last Updated**: 2026-03-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # License 控制方案 ## 总览 ``` license/ ├── collect_machine_id.py # 客户机器上运行,采集指纹 → machine_info.json ├── gen_license.py # 我们自己的服务器运行,签发 license.lic ├── license_check.py # Python 校验 API + import hook(打入镜像) ├── license_check.h # C/C++ 校验头文件 ├── license_check.c # C/C++ 校验实现(OpenSSL + cJSON) ├── test_license.py # 本地快速验证整个流程 └── README.md # 本文件 ``` --- ## 流程 ``` 客户机器 我们的服务器 --------- ------------- collect_machine_id.py gen_license.py 采集 CPU/主板/MAC 用 RSA 私钥签名 → machine_info.json →→→ → license.lic →→→ 发给客户 ↓ 放到 /etc/bd-license/license.lic ↓ 程序启动时自动校验(Python / C / C++) ``` --- ## 快速开始 ### 1. 安装依赖 ```bash yum install binutils dmidecode openssl-devel rsync pip install cryptography psutil ``` ### 2. 生成 RSA 密钥对(只需一次,私钥妥善保管) ```bash python gen_license.py --gen-keys # 生成 private_key.pem(自己留)和 public_key.pem(打入镜像) ``` ### 3. 客户运行采集脚本 ```bash python collect_machine_id.py --output machine_info.json # 把 machine_info.json 发给我们 ``` ### 4. 我们签发 license ```bash # linux 执行 python gen_license.py \ --machine-info machine_info.json \ --expire 2027-06-01 \ --output license.lic \ --private-key private_key.pem # windows 执行 python gen_license.py ^ --machine-info machine_info.json ^ --expire 2027-06-01 ^ --output license.lic ^ --private-key private_key.pem # 把 license.lic 发给客户 ``` ### 5. 客户放置文件 ```bash # 宿主机 mkdir -p /etc/bd-license/ cp license.lic /etc/bd-license/license.lic cp public_key.pem /etc/bd-license/public_key.pem ``` ```bash # 如果是windows如何验证?设置到系统环境变量中去 LICENSE_FILE=C:\path\to\license.lic PUBLIC_KEY_FILE=C:\path\to\public_key.pem ``` ### 6. 本地验证 ```bash python test_license.py ``` ### 完整的一个集成流程 ``` # 1. 在实体机(宿主机)以 root 采集指纹 python collect_machine_id.py --output machine_info.json # 2. 发给厂商签发 license python gen_license.py --machine-info machine_info.json --expire 2027-01-01 # 3. 实体机部署 —— 直接校验 python license_check.py --license license.lic --public-key public_key.pem # 4. Docker 部署 —— 挂载 sysfs 后 license.lic 完全复用 docker run \ -v /sys/class/dmi/id:/sys/class/dmi/id:ro \ # 宿主机硬件信息注入,只读 -v /etc/bd-license/license.lic:/etc/bd-license/license.lic:ro \ -v /etc/bd-license/public_key.pem:/etc/bd-license/public_key.pem:ro \ your_image ``` ### 验证证书失效场景(证明有效) * 修改 license.lic(签名验证失败) 修改/etc/bd-license/license.lic 中的内容(比如过期日期),导致签名验证失败,输出如下错误: ```shell [root@orca-arm-10-1-48-200 license]# python license_check.py [SIGNATURE_ERROR] License 签名验证失败(文件可能被篡改) ``` * 机器序列号不匹配(机器绑定) 整体复制 license.lic 到另一台机器上,导致机器指纹不匹配,输出如下错误: ```shell [root@elves-10-1-47-200 license]# python license_check.py --license license.lic --public-key public_key.pem [MACHINE_MISMATCH] 机器指纹不匹配 (license=1f07c78dc962eadb...,当前=d96ab4303d71b34a...) ``` * 过期日期到期(过期失效) date -s "2027-06-02" 将系统日期修改为过期后,输出如下错误: ```shell [root@orca-arm-10-1-48-200 license]# python license_check.py [EXPIRED] License 已过期(过期时间: 2027-06-01T00:00:00Z,当前: 2027-06-01T16:05:02Z) [root@orca-arm-10-1-48-200 license]# date Wed Jun 2 12:05:06 AM CST 2027 ``` --- ## Python 集成 ### 方式 A:在 entrypoint 最前面显式校验 ```python from license_check import enforce_license enforce_license() # 不合法/过期 → exit(1) import paddle # 正常继续 ``` ### 方式 B:Import Hook 自动拦截 ```python # 在 sitecustomize.py 或 entrypoint 最开头加一行 import license_check # noqa — 安装 hook,之后 import paddle 时自动校验 ``` ### 环境变量覆盖路径 ```bash export LICENSE_FILE=/data/license.lic export PUBLIC_KEY_FILE=/data/public_key.pem ``` --- ## C/C++ 集成 ```c #include #include "license_check.h" int main() { license_init("/etc/bd-license/license.lic", "/etc/bd-license/public_key.pem"); license_enforce(); // 不合法 → exit(1) printf("license valid, continue running...\n"); // ... 正常运行 } ``` 编译: ```bash # 依赖: openssl-devel + cJSON(把 cJSON.h/cJSON.c 放到同目录) gcc -o myapp myapp.c license_check.c cJSON.c -lssl -lcrypto -I. g++ -o myapp myapp.cpp license_check.c cJSON.c -lssl -lcrypto -I. ``` --- ## Docker 集成 ### Dockerfile 片段 ```dockerfile # 公钥打入镜像 COPY public_key.pem /etc/bd-license/public_key.pem COPY license/ /app/license/ ENTRYPOINT ["python", "/app/entrypoint.py"] ``` ### docker run:挂载宿主机 DMI sysfs + license 文件(唯一可信方式) ```bash docker run \ -v /sys/class/dmi/id:/sys/class/dmi/id:ro \ -v /etc/bd-license/license.lic:/etc/bd-license/license.lic:ro \ -v /etc/bd-license/public_key.pem:/etc/bd-license/public_key.pem:ro \ your_image ``` `/sys/class/dmi/id` 只读挂载后,容器内读取到的是宿主机固件中的真实硬件序列号, 容器内进程无法修改这些值,因此是机器绑定的唯一可信来源。 ### Docker 内验证指纹采集 ```bash # 挂载 DMI sysfs 后采集机器指纹(无需 --privileged) docker run --rm \ -v /sys/class/dmi/id:/sys/class/dmi/id:ro \ your_image \ python /app/license/collect_machine_id.py ``` > ⚠️ **不要使用环境变量注入 machine_id**(`-e HOST_MACHINE_ID=xxx`)。 > 环境变量由用户完全控制,可将同一份 license + machine_id 部署到任意数量的机器, > 完全绕过机器绑定,失去授权意义。 --- ## 校验结果说明 | 状态 | 含义 | |------|------| | `valid` | 合法,正常运行 | | `expired` | 已过期,exit(1) | | `invalid` | license 文件格式错误 | | `file_not_found` | license 或公钥文件不存在 | | `machine_mismatch` | 机器指纹不匹配 | | `signature_error` | 签名验证失败(文件被篡改) |