2025-11-20 · 实战
32
实战 · 2025-11-20

私有化部署授权系统 - 第2章:License授权体系

第2章:License授权体系

🎯 本章目标

学完这一章,你将理解:
- License文件的结构和内容
- 数字签名如何防止篡改
- License的签发和验证流程

预计学习时间: 20分钟


2.1 License是什么?

定义(初中生版)

License(许可证) = 一份数字文件,记录了客户购买的使用权限

生活类比

License就像你的驾驶证:

驾驶证
License

姓名、照片
客户名称、ID

准驾车型(C1、B2)
授权功能(基础版、高级版)

有效期(6年)
使用期限(1年、3年)

防伪标识
数字签名

交警验证
平台验证

核心作用: 证明你有权使用这个软件,以及能用哪些功能、用多久。


2.2 License文件里有什么?

完整结构图

License文件
├── 📋 元数据(文件本身的信息)
│   ├── 版本号
│   ├── 生成时间
│   └── 生成工具
│
├── 👤 客户信息
│   ├── 客户ID
│   ├── 公司名称
│   ├── 合同编号
│   └── 联系方式(加密)
│
├── ✅ 授权信息(核心部分)
│   ├── License ID
│   ├── 授权类型(试用版/正式版/企业版)
│   ├── 时间控制
│   │   ├── 签发时间
│   │   ├── 生效时间
│   │   ├── 失效时间
│   │   └── 宽限期
│   ├── 容量限制
│   │   ├── 最大机器人数
│   │   ├── 最大并发数
│   │   ├── 最大用户数
│   │   └── 最大存储空间
│   └── 功能模块
│       ├── 核心功能(基础控制、任务调度)
│       ├── 高级功能(AI优化、集群协调)
│       └── 数据功能(报表、分析、导出)
│
├── 🖥️ 部署限制
│   ├── 部署模式(私有云/混合云)
│   ├── 硬件绑定(CPU ID、MAC地址)
│   └── 网络限制(允许的IP段)
│
└── 🔒 安全签名
    ├── 签名算法(RSA-SHA256)
    ├── 签名值
    └── 证书链

关键字段详解

1. 时间控制(最重要)

时间控制:
  签发时间: 2024-01-15 10:00:00  # 厂商生成License的时间
  生效时间: 2024-02-01 00:00:00  # 客户可以开始使用的时间
  失效时间: 2025-02-01 00:00:00  # 到期时间
  宽限期: 7天                      # 过期后还能用7天(提醒续费)

生活类比:
- 签发时间 = 驾驶证打印日期
- 生效时间 = 驾驶证生效日期
- 失效时间 = 驾驶证到期日期
- 宽限期 = 到期后还能开车回家,但要尽快换证

2. 容量限制

容量限制:
  最大机器人数: 100台    # 最多接入100台机器人
  最大并发数: 50台       # 同时在线最多50台
  最大用户数: 20人       # 最多20个管理员账号
  最大存储: 1000GB      # 数据最多存1TB

为什么需要限制?
- 不同价格对应不同规模
- 防止客户超量使用
- 保护系统性能

3. 功能模块控制

功能模块:
  核心功能:
    基础控制: ✅ 开启
    任务调度: ✅ 开启
    实时监控: ✅ 开启

  高级功能:
    AI优化: ❌ 关闭      # 需要购买高级版
    多楼层管理: ❌ 关闭
    集群协调: ❌ 关闭

  数据功能:
    基础报表: ✅ 开启
    高级分析: ❌ 关闭
    数据导出: ✅ 开启
    API访问: ❌ 关闭

类比游戏版本:
- 基础版 = 免费版游戏(只能玩主线)
- 高级版 = 付费DLC(解锁新地图、新角色)
- 企业版 = 完整版(所有功能)


2.3 数字签名:防篡改的关键

问题:如果客户修改License怎么办?

假设客户拿到License文件后:

# 原始License
失效时间: 2025-02-01
最大机器人数: 100

# 客户修改后
失效时间: 2099-12-31  # 改成100年后
最大机器人数: 99999   # 改成无限台

如何防止这种情况?答案是:数字签名!

数字签名的原理(用故事讲解)

故事:古代的蜡封信

皇帝写了一封圣旨 → 用火漆封口 → 盖上玉玺
                                    ↓
                          任何人拆开信封,玉玺就会破损
                                    ↓
                          大臣收到信后,检查玉玺是否完整

数字签名就是现代版的"玉玺"!

数字签名的工作流程

第一步:厂商生成License(签名)

1. 厂商写好License内容
   ↓
2. 用"私钥"对内容进行加密运算
   (私钥 = 只有厂商有的密码,绝对保密)
   ↓
3. 生成一串签名值(像指纹一样唯一)
   ↓
4. 把License内容 + 签名值 + 公钥 打包给客户
   (公钥 = 可以公开的密码,用来验证签名)

第二步:客户平台验证License

1. 读取License内容
   ↓
2. 用"公钥"验证签名值
   ↓
3. 判断:
   - 如果签名匹配 → License未被篡改 ✅
   - 如果签名不匹配 → License被修改过 ❌ 拒绝启动

形象比喻

私钥 = 你的签名笔迹(只有你能写出来)
公钥 = 笔迹鉴定标准(任何人都能用来验证)
签名值 = 你的签名(独一无二)

如果有人修改了文件内容,签名就对不上了!

代码示例(简化版)

# 厂商端:生成License并签名
def generate_license(customer_info):
    # 1. 准备License内容
    license_data = {
        "customer_id": "CUST-2024-001",
        "valid_until": "2025-02-01",
        "max_robots": 100
    }

    # 2. 用私钥签名(私钥保密,只有厂商有)
    signature = sign_with_private_key(license_data, private_key)

    # 3. 打包
    license_package = {
        "data": license_data,      # License内容
        "signature": signature,    # 签名值
        "public_key": public_key   # 公钥(给客户验证用)
    }

    return license_package

# 客户端:验证License
def verify_license(license_package):
    # 1. 提取内容
    data = license_package["data"]
    signature = license_package["signature"]
    public_key = license_package["public_key"]

    # 2. 用公钥验证签名
    is_valid = verify_signature(data, signature, public_key)

    if is_valid:
        print("✅ License验证成功,未被篡改")
        return True
    else:
        print("❌ License验证失败,可能被修改过")
        return False

2.4 License的生命周期

完整流程图

[阶段1:商务签约]
客户购买授权 → 签订合同 → 确定授权参数
                              ↓
[阶段2:License签发]
销售提交申请 → 技术审核 → 配置参数 → 生成License → 数字签名
                              ↓
[阶段3:交付客户]
发送License文件(通过邮件/U盘)
                              ↓
[阶段4:客户激活]
客户导入License → 平台验证签名 → 验证通过 → 记录激活时间
                              ↓
[阶段5:日常使用]
平台定期检查License(每天一次)
├── 检查是否过期
├── 检查设备数量是否超限
└── 检查功能是否授权
                              ↓
[阶段6:到期续费]
提前30天预警 → 客户续费 → 生成新License → 导入更新

关键时间节点

时间点
动作
说明

T-30天
发送续费提醒
提前通知客户

T-7天
发送紧急提醒
即将到期

T日
License到期
进入宽限期

T+7天
宽限期结束
停止服务


2.5 License验证的判断逻辑

验证检查表

平台启动时,会依次检查以下项目:

检查项
检查内容
通过条件
失败后果

1. 文件完整性
License文件是否存在
文件存在且可读
拒绝启动

2. 签名验证
数字签名是否匹配
签名正确
拒绝启动

3. 时间有效性
是否在有效期内
当前时间 < 失效时间
进入宽限期/停止

4. 硬件匹配
服务器硬件是否匹配
硬件指纹匹配
要求重新授权

5. 容量检查
设备数量是否超限
当前数量 ≤ 授权数量
拒绝新设备接入

6. 功能检查
使用的功能是否授权
功能已授权
功能禁用

验证代码示例

def validate_license(license_file):
    """
    验证License的完整流程
    """

    # 检查1:文件是否存在
    if not os.path.exists(license_file):
        return "FAIL", "License文件不存在"

    # 检查2:验证签名
    license_data = load_license(license_file)
    if not verify_signature(license_data):
        return "FAIL", "License签名验证失败,可能被篡改"

    # 检查3:验证时间
    current_time = get_current_time()
    valid_until = license_data["valid_until"]
    grace_period = license_data["grace_period_days"]

    if current_time > valid_until + grace_period * 86400:
        return "EXPIRED", "License已过期"
    elif current_time > valid_until:
        return "GRACE_PERIOD", f"License已过期,宽限期剩余{grace_period}天"

    # 检查4:验证硬件绑定
    if license_data["hardware_binding"]["enabled"]:
        if not check_hardware_match(license_data):
            return "FAIL", "硬件不匹配,请联系厂商"

    # 检查5:验证容量
    current_robot_count = get_robot_count()
    max_robots = license_data["max_robots"]
    if current_robot_count > max_robots:
        return "OVER_LIMIT", f"设备数量超限({current_robot_count}/{max_robots})"

    # 所有检查通过
    return "VALID", "License验证成功"

2.6 硬件绑定:防止License被复制

问题:如果客户把License复制给别人怎么办?

客户A购买了License → 复制给客户B → 客户B也能用

解决方案:硬件绑定

硬件绑定的原理

核心思想: 把License和客户的服务器硬件"绑定"在一起

生成License时:
1. 收集客户服务器的硬件信息
   - CPU序列号
   - 网卡MAC地址
   - 硬盘序列号
   - 主板序列号

2. 生成"硬件指纹"(把这些信息混合计算)
   硬件指纹 = SHA256(CPU + MAC + 硬盘 + 主板)

3. 把硬件指纹写入License

验证License时:
1. 读取当前服务器的硬件信息
2. 计算当前硬件指纹
3. 对比License中的硬件指纹
   - 如果匹配 → 是同一台服务器 ✅
   - 如果不匹配 → 服务器被更换了 ❌

灵活性设计

问题: 如果客户的服务器坏了,换了新服务器怎么办?

解决方案: 灵活绑定模式

硬件绑定策略:
  模式: FLEXIBLE  # 灵活模式

  匹配规则:
    - 至少匹配3项硬件信息
    - 允许更换1-2个硬件组件

  变更控制:
    最大变更次数: 2次/年    # 一年最多换2次硬件
    需要审批: true          # 变更需要厂商审批

2.7 License类型对比

三种常见类型

类型
试用版
正式版
企业版

有效期
30天
1年
3年

设备数量
10台
100台
不限

功能
仅基础功能
基础+部分高级
全部功能

技术支持

工作日支持
7×24小时

价格
免费
10万/年
50万/3年

硬件绑定


可续费



2.8 本章小结

核心要点

  1. License = 数字化的使用许可证,记录了客户的使用权限
  2. 数字签名 = 防篡改的关键技术,任何修改都会被检测到
  3. 硬件绑定 = 防止License被复制,绑定到特定服务器
  4. 验证流程 = 多层检查,确保License合法有效

类比总结

License = 驾驶证
数字签名 = 防伪标识
硬件绑定 = 人脸识别(证明是你本人)
验证流程 = 交警查证(检查各项信息)

License的核心作用

┌─────────────────────────────────┐
│         License的作用            │
├─────────────────────────────────┤
│ ✅ 控制使用期限(防止永久使用)   │
│ ✅ 控制功能范围(防止越权使用)   │
│ ✅ 控制使用规模(防止超量使用)   │
│ ✅ 防止篡改(数字签名)          │
│ ✅ 防止复制(硬件绑定)          │
└─────────────────────────────────┘

🤔 思考题

  1. 理解题:为什么需要"公钥"和"私钥"两把钥匙?只用一把不行吗?

  2. 场景题:如果客户的服务器硬盘坏了,换了新硬盘,License还能用吗?应该怎么处理?

  3. 挑战题:如果客户修改了系统时间,把时间调回到License有效期内,能绕过验证吗?(提示:下一章会讲解决方案)


📚 下一章预告

第3章我们将学习设备密钥体系
- 设备密钥和License有什么区别?
- 每个机器人如何拥有自己的"身份证"?
- 密钥的种类和用途是什么?

继续加油!


本章关键词
- License(许可证)
- 数字签名
- 公钥/私钥
- 硬件绑定
- 硬件指纹
- 时间控制
- 容量限制
- 功能授权

目录 最新
← 左侧翻上一屏 · 右侧翻下一屏 · 中间唤出菜单