软件 License 不是在客户端写一句“激活码正确就放行”。更可靠的实现是:服务端校验授权码并签发许可证,客户端使用预先内置的产品公钥验签,再检查有效期、状态和设备指纹。
下面按客户端真正需要落地的顺序说明。
1. 先定义授权规则
开发前先确定四件事:
授权按永久、期限还是订阅生效; 一份授权允许激活多少台设备; 是否绑定硬件指纹; 是否需要心跳同步续期、吊销和功能配置。
这一步决定许可证中需要包含哪些字段。
2. 在客户端内置产品公钥
授权服务使用私钥签发许可证,客户端使用公钥验证签名。私钥和管理端 API Key 只能留在服务端,不能打包进软件。
公钥应在开发或构建阶段写入客户端代码或只读资源,不能把激活接口临时返回的公钥当作信任来源,否则许可证和公钥可能被一起替换。
3. 生成硬件指纹
客户端根据相对稳定的设备特征生成硬件指纹。它用于判断当前许可证是否属于本机,也用于限制授权码可激活的设备数量。
指纹策略不要只追求严格:硬件更换、系统重装和虚拟机克隆都可能影响结果,需要同时设计解绑和重新激活流程。
4. 提交激活请求
首次激活通常提交以下信息:
{”authorization_code”: ”用户输入的授权码”,”product_code”: ”当前产品编码”,”hardware_fingerprint”: ”当前设备指纹”,”software_version”: ”1.0.0”}
服务端检查授权码状态、有效期、产品归属和激活数量,校验通过后签发许可证。
5. 保存许可证
客户端保存服务端返回的许可证文件。若启用了心跳,还需要保存心跳使用的许可证标识和间隔配置。
许可证可以是结构化数据,但必须带有数字签名。仅把有效期写入普通 JSON,用户修改文件后仍可能绕过限制。
6. 每次启动先完成本地校验
推荐顺序如下:
读取本地许可证-> 使用内置产品公钥验签-> 检查授权状态-> 检查开始和结束时间-> 比对当前设备指纹-> 读取功能配置与使用限制-> 放行受保护功能
必须先验签,再读取许可证中的业务字段。验签失败、授权过期、状态异常或设备不匹配时,应阻止受保护功能并给出明确提示。
7. 按需增加心跳
首次激活后,不建议每次启动都强制联网。更稳妥的方式是本地验签负责启动,后台心跳负责同步续期、吊销和配置变化。
完全离线的客户环境,可以改用“采集设备指纹—在有网环境签发—导入离线许可证—本地验签”的流程。
三个常见错误
只在客户端比较激活码,没有签名许可证; 把私钥或管理端凭证放入客户端; 每次启动强依赖授权服务器,没有网络异常策略。
如果不想从零搭建服务端、许可证格式和激活接口,可以使用现成授权平台。雪松授权云提供授权码、设备绑定、在线/离线激活、本地验签、心跳、续期和吊销能力,也支持通过 API、SDK 或 AI 接入提示词改造已有软件。
接入说明:雪松授权云开发者中心
夜雨聆风