# license **Repository Path**: baseme/license ## Basic Information - **Project Name**: license - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-11-02 - **Last Updated**: 2023-11-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # License #### License简介 `License,即版权许可证,一般用于收费软件给付费用户提供的访问许可证明` `根据应用部署位置的不同,一般可以分为以下两种情况讨论:` * `1、应用部署在开发者自己的云服务器上` 用户通过账号登录的形式远程访问,只需要在账号登录的时候校验目标账号的有效期、访问权限等信息即可。 * `2、应用部署在客户的内网环境` 开发者无法控制客户的网络环境,也不能保证应用所在服务器可以访问外网,因此使用服务器许可文件,在应用启动的时候加载证书,然后在登录或者其他关键操作的地方校验证书的有效性。 #### 使用JDK自带的 keytool 工具生成公私钥证书库 公钥库密码为:public_pwd123,私钥库密码为:private_pwd123 ##### 生成私匙库 `keytool -genkeypair -validity 3650 -alias "privateKey" -keystore "privateKeys.keystore" -storepass "public_pwd123" -keypass "private_pwd123" -dname "CN=HQW, OU=CALTTA, O=OME, L=SZ, ST=GD, C=CN"` `-keypass  私有密钥的密码` `-storepass 存取密码,从keystore文件中将信息取出` ##### 导出私匙库证书 `keytool -exportcert -alias "privateKey" -keystore "privateKeys.keystore" -storepass "public_pwd123" -file "certfile.cer"` ##### 导入公匙库 `keytool -import -alias "publicCert" -file "certfile.cer" -keystore "publicCerts.keystore" -storepass "public_pwd123"` 上述命令执行完成之后,会在当前路径下生成三个文件,分别是:privateKeys.keystore、publicCerts.keystore、certfile.cer。其中文件certfile.cer不再需要可以删除,文件privateKeys.keystore用于当前的 ServerDemo 项目给客户生成license文件,而文件publicCerts.keystore则随应用代码部署到客户服务器,用户解密license文件并校验其许可信息。 #### 项目介绍 在基于Spring的项目中使用 `TrueLicense `生成和验证`License证书`(服务器许可)的示例代码 #### Tips 只讨论代码层面的许可限制,暂不考虑逆向破解等问题 #### 技术依赖: * `Spring Boot`:项目基础架构 * `TrueLicense `:基于`Java`实现的生成和验证服务器许可的简单框架 #### 环境依赖: * `JDK8+` #### 两个子项目说明: #### - `ServerDemo`:用于**开发者**给客户生成`License证书`的示例代码 - `ClientDemo`:**模拟需要给客户部署的业务项目** #### ServerDemo项目: #### 对外发布了两个RESTful接口: (1)获取服务器硬件信息 : 请求地址:`http://127.0.0.1:7000/license/getServerInfos` ![获取服务器硬件信息](https://www.zifangsky.cn/wp-content/uploads/2018/07/20180710140711.png) (2)生成证书 : 请求地址:`http://127.0.0.1:7000/license/generateLicense` 请求时需要在Header中添加一个 **Content-Type** ,其值为:**application/json;charset=UTF-8**。请求参数如下: ```json { "subject": "license_demo", "privateAlias": "privateKey", "keyPass": "private_password1234", "storePass": "public_password1234", "licensePath": "D:/file/license/license.lic", "privateKeysStorePath": "D:/file/license/privateKeys.keystore", "issuedTime": "2023-07-10 00:00:01", "expiryTime": "2029-12-31 23:59:59", "consumerType": "User", "consumerAmount": 1, "description": "这是证书描述信息", "licenseCheckModel": { "ipAddress": ["192.168.245.1", "10.0.5.22"], "macAddress": ["00-50-56-C0-00-01", "50-7B-9D-F9-18-41"], "cpuSerial": "BFEBFBFF000406E3", "mainBoardSerial": "L1HF65E00X9" } } ``` ![生成证书](https://www.zifangsky.cn/wp-content/uploads/2018/07/20180710141528.png) #### ClientDemo项目: #### 项目启动时安装证书,通过`cn/zifangsky/license/LicenseCheckListener.java`类实现。 用户登录时校验证书的可用性,通过`cn/zifangsky/license/LicenseCheckInterceptor.java`类实现。 #### 特别说明: #### 详细开发思路可以参考我写的这篇文章:[https://www.zifangsky.cn/1277.html](https://www.zifangsky.cn/1277.html) 数字证书中keytool命令使用说明 -alias 证书别名 -keystore 指定密钥库的名称(cacerts是jre中默认的证书库名字,也可以使用其它名字 ) -storepass 指定密钥库的密码 -keypass 指定别名条目的密码 -list   显示密钥库中的证书信息 -v   显示密钥库中的证书详细信息 -export  将别名指定的证书导出到文件 -file   指定导出到文件的文件名 -delete   删除密钥库中某条目 -import   将已签名数字证书导入密钥库 -keypasswd 修改密钥库中指定条目口令 -dname 指定证书拥有者信息 -keyalg 指定密钥的算法 -validity 指定创建的证书有效期多少天 -keysize 指定密钥长度