# LicenseGuard **Repository Path**: zhoukai1992/LicenseGuard ## Basic Information - **Project Name**: LicenseGuard - **Description**: sprongBoot +公私钥技术生成授权证书的完整demo。 交付给客户之后,如何保证客户不随意部署?如何将部署在客户服务器上的代码在合同期外无法使用? - **Primary Language**: Java - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 2 - **Created**: 2025-10-24 - **Last Updated**: 2026-05-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: Java, LICENSE, 授权证书, SpringBoot ## README ### 背景 当项目交付给客户之后,如何保证客户不随意部署?如何将部署在客户服务器上的代码在合同期外无法使用? ### 解决方案 1. 使用license 授权机制原理,在项目启动时校验授权证书是否有效,添加拦截器拦截所有接口校验当前的授权证书是否有效。 2. license授权机制的原理 - 生成密钥对,包含私钥和公钥。 - 授权者保留公钥,使用公钥对授权信息诸如使用截止日期,mac 地址等内容生成 license 签名证书。 - 私钥给使用者,放在代码中使用,用于验证 license 签名证书是否符合使用条件。 ### 简介 本项目采用SpringBoot 框架实现license授权机制,包含许可证生成和验证两个主要模块,支持自定义有效期、服务器硬件信息验证等功能。 ### 技术栈 - Spring Boot 2.6.5 - Java 8 - Hutool 工具库 - Bouncy Castle 加密库 - MapStruct 用于对象转换 - Lombok 用于简化代码 ### 模块介绍 | 模块 | 介绍 | |----------|------------------| | manage | 许可证生成管理模块,提供生成密钥对和许可证的API接口 | | business | 许可证验证模块,集成到需要授权的业务系统中进行许可证验证 | ### 项目结构 ``` license_demo-master/ ├── business/ # 许可证验证模块 │ ├── src/main/java/com/zhoukai/business/ │ │ ├── service/license/ # 许可证验证服务 │ │ │ ├── LicenseCheckListener.java # 启动时验证许可证 │ │ │ ├── LicenseValidateFilter.java # 接口拦截验证 │ │ │ └── LicenseVerify.java # 许可证验证核心类 │ │ ├── util/license/ # 许可证相关工具类 │ │ │ ├── AbstractServerInfos.java # 服务器信息抽象类 │ │ │ ├── LicenseContent.java # 许可证内容实体 │ │ │ ├── LinuxServerInfos.java # Linux服务器信息获取 │ │ │ └── WindowsServerInfos.java # Windows服务器信息获取 │ │ └── BusinessApplication.java # 业务应用入口 │ └── src/main/resources/ │ ├── application.yml # 配置文件 │ └── license.lic # 许可证文件 ├── manage/ # 许可证生成模块 │ ├── src/main/java/com/zhoukai/manage/ │ │ ├── controller/ # API接口控制器 │ │ │ └── LicenseController.java # 许可证生成API │ │ ├── converter/ # 对象转换器 │ │ ├── dto/ # 数据传输对象 │ │ └── util/ # 工具类 │ └── src/main/resources/ │ └── application.yml # 配置文件 └── pom.xml # 项目父配置文件 ``` ### 快速开始 #### 1. 构建项目 ```bash mvn clean install ``` #### 2. 启动管理模块 ```bash cd manage java -jar target/manage-1.0-SNAPSHOT.jar ``` #### 3. 启动业务模块 ```bash cd business java -jar target/business-1.0-SNAPSHOT.jar ``` ### API 接口说明 #### 管理模块 API ##### 1. 生成密钥对 - 请求URL: `/license/secretKey` - 请求方法: POST - 响应示例: ```json { "publicKey": "公钥内容", "privateKey": "私钥内容" } ``` ##### 2. 生成许可证 - 请求URL: `/license/create` - 请求方法: POST - 请求体示例: ```json { "issuedTime": "2024-01-01 00:00:00", "expiryTime": "2025-01-01 00:00:00", "secretKey": "公钥内容", "licenseCheckModel": { "ipAddress": ["192.168.1.100"], "macAddress": ["00:11:22:33:44:55"], "cpuSerial": "CPU序列号", "mainBoardSerial": "主板序列号" } } ``` - 响应: 生成的许可证文件(license.lic) ##### 3. 验证许可证 - 请求URL: `/license/check` - 请求方法: POST - 请求参数: - file: 许可证文件(license.lic) - secretKey: 私钥内容 - 响应示例: ```json { "issuedTime": "2024-01-01 00:00:00", "expiryTime": "2025-01-01 00:00:00", "createTime": "2024-01-31 15:18:00", "sign": "签名内容", "licenseCheckModel": { "ipAddress": ["192.168.1.100"], "macAddress": ["00:11:22:33:44:55"], "cpuSerial": "CPU序列号", "mainBoardSerial": "主板序列号" } } ``` ### 配置说明 #### 业务模块配置 (application.yml) ```yaml server: port: 8081 license: secretKey: 私钥内容 # 用于验证许可证的私钥 ``` ### 使用流程 1. **生成密钥对**:通过管理模块的 `/license/secretKey` 接口生成公钥和私钥。 2. **配置业务模块**:将生成的私钥配置到业务模块的 `application.yml` 文件中。 3. **生成许可证**:通过管理模块的 `/license/create` 接口,使用公钥生成许可证文件。 4. **部署许可证**:将生成的许可证文件 `license.lic` 放置到业务模块的 `resources` 目录下。 5. **启动验证**:启动业务模块时会自动验证许可证的有效性。 ### 许可证验证内容 1. **时间验证**:检查许可证是否在有效期内。 2. **签名验证**:验证许可证签名是否合法,确保许可证未被篡改。 3. **服务器信息验证**: - IP地址验证 - MAC地址验证 - CPU序列号验证 - 主板序列号验证 ### 注意事项 1. 密钥对一旦生成,应妥善保管,特别是私钥不应泄露。 2. 许可证文件包含敏感信息,建议加密存储。 3. 不同操作系统的服务器信息获取方式可能不同,项目已支持 Windows 和 Linux。 4. 在生产环境中,建议将私钥通过环境变量或加密配置文件方式注入,避免硬编码。 5. 许可证验证逻辑可以根据实际需求进行扩展,例如添加更多的服务器硬件信息验证。 ### 扩展建议 1. 可以将许可证验证功能封装成独立的 SDK,方便其他项目集成。 2. 可以添加许可证自动更新机制,当许可证即将过期时自动提醒。 3. 可以实现许可证的在线验证功能,连接到授权服务器进行实时验证。 4. 可以添加许可证的使用统计功能,记录许可证的使用情况。 ### 操作手册 1. 下载代码,启动 manage ![启动画面](images/screenshot_2025-10-25_10-37-34.png) 2. 使用接口调用工具调用 /license/secretKey(生成密钥) 接口得到公钥和私钥 ![调用接口](images/screenshot_2025-10-25_10-38-58.png) 3. 使用接口调用工具调用 /license/create (生成证书)接口得到证书保存 ![证书](images/screenshot_2025-10-25_10-40-49.png) 4. 在business 项目中配置 license: secretKey: MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIez2nh4LN0b2hWU5+jUfvVdT6Mh6x2QItlxb+oS2Dqbtecbj9LWyiZ+hQGcqGbRNGWDrJFDMgWmVIZuvs5uH9GViFeUa4EJwBYkbGyqmC3f5kpWOwsUxY/7NVx+mYupgwgWUdP/wNxKbBC59SEuMIMMjQlZF6aCZr8Bk/rlIPbBAgMBAAECgYAT9GGK13kZZnASPlw/w4eLwxXj0igFp91IBkNDs1OygpUkD8x9X3JIaNBcJVIqFFdVGiC1F6FybTv+rKhIKK9q5m+r8gqu7PtY1N5ITERKYz6rLK7J+APfsZEALCw+BlnYfqEzXFAG4Daf5fIPK/AHd+Y9TP5yDZfgf3jAVNdhcQJBAMA4CnvtgAbtvFmtQ8Ekt+x7vG2MoTA+d8ytiJf0jpBRyznKnAaU7HG847lDmMA7MrS+FNlEitxsvXJd2/mya90CQQC0uw2I8txw3smszkU9zbVzqsaPqlT95pnNw9foVWWWJ3dX5px6m+1KNOyK6Jj6qfd8xGCOfq96QO4ogdxcQgo1AkEAhdH+Ko0MRsaYDG697udbTL5QToxLY8T5rntZz0CpR/xJ2fAec86WVhDFEaPn4lzUTlTPOvunGRJzSf3iOZJn2QJAcytcBbBV36tpMzDDGQ5Umh/ypqxxutbPnjs2BD0fHl+KAr7Xap6gyRAOyLpOejYDm0N9EHEUm8Byw+d1KGmBHQJAUlTyO2DAoUSa/TjsLAdhZBxQVrPlyaORppMTN4nNl76tTjsDrARqeCfk8q3638GPqWBIGTf1l1w+Q2PauV5JNw== #“生成密钥”接口中生成的私钥 5. 在resources目录下放入“生成证书”接口生成的证书。 ![证书](images/screenshot_2025-10-25_10-44-38.png) 6. 启动business服务。![启动日志](images/screenshot_2025-10-25_10-43-30.png)