1、简介
TrueLicense是一个开源的证书管理引擎,使用场景:当项目交付给客户之后用签名来保证客户不能随意使用项目,默认校验了开始结束时间,可扩展增加mac地址校验等。 其中还有ftp的校验没有尝试,本demo详细介绍的是本地校验 license授权机制的原理: 生成密钥对,方法有很多。我们使用trueLicense来做软件产品的保护,我们主要使用它的LicenseManager类来生成证书文件、安装证书文件、验证证书文件。
2、原理
- 首先需要生成密钥对,方法有很多,JDK中提供的KeyTool即可生成。
- 授权者保留私钥,使用私钥对包含授权信息(如截止日期,MAC地址等)的license进行数字签名。
- 公钥交给使用者(放在验证的代码中使用),用于验证license是否符合使用条件。
3、生成密钥对
3.1、生成私匙库
validity:私钥的有效期多少天(3650≈10年)
alias:私钥别称
keystore: 指定私钥库文件的名称(生成在当前目录)
storepass:指定公/私钥库的密码(获取keystore信息所需的密码)
keypass:指定别名条目的密码(私钥的密码)
keytool -genkeypair -keysize 1024 -validity 3650 -alias "privateKeyAliasDemo" -keystore "privateKeyStoreNameDemo.keystore" -storepass "storePwdDemo@qst613" -keypass "privateKeyDemo@qst613" -dname "CN=demo, OU=demo, O=demo, L=TJ, ST=TJ, C=CN"
3.2、把私匙库内的公匙导出到一个文件当中
alias:私钥别称
keystore:指定私钥库的名称(在当前目录查找)
storepass: 指定公/私钥库的密码
file:证书名称
keytool -exportcert -alias "privateKeyAliasDemo" -keystore "privateKeyStoreNameDemo.keystore" -storepass "storePwdDemo@qst613" -file "certFileDemo.cer"
3.3、再把这个证书文件导入到公匙库
alias:公钥别称
file:证书名称
keystore:公钥文件名称
storepass:指定公/私钥库的密码(这个后面在项目中使用)
keytool -import -alias "publicKeyAliasDemo" -file "certFileDemo.cer" -keystore "publicKeyStoreNameDemo.keystore" -storepass "storePwdDemo@qst613"
注意:公/私钥库密码要一致。
4、代码实现
完整代码见:
4.1、引入依赖
<!--license依赖-->
<dependency>
<groupId>de.schlichtherle.truelicense</groupId>
<artifactId>truelicense-core</artifactId>
<version>1.33</version>
<scope>provided</scope>
</dependency>
<!--工具包,项目内已引入依赖的不要导入-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
<!--json,项目内已引入依赖的不要导入-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.33</version>
</dependency>
4.2、具体类
下面是简单说明,详见代码实现:
4.3、yml配置
license:
#License路径
licensePath: D:/0/demo/license.lic
#项目主题与生成License保持一致
subject: dq-demo
#公钥别称
publicAlias: publicKeyAliasDemo
#访问公钥库的密码
storePass: storePwdDemo@qst613
#公钥文件路径
publicKeysStorePath: D:/0/demo/publicKeyStoreNameDemo.keystore
4.4、生成证书
使用下面方式调用系统服务或者使用工具见:
使用Postman,用POST请求方式请求http://localhost:8090/license/generateLicense
{
"subject": "dq-demo",
"privateAlias": "privateKeyAliasDemo",
"keyPass": "privateKeyDemo@qst613",
"storePass": "storePwdDemo@qst613",
"licensePath": "D:/0/demo/license.lic",
"privateKeysStorePath": "D:/0/demo/privateKeyStoreNameDemo.keystore",
"issuedTime": "2022-10-11 00:00:00",
"expiryTime": "2032-10-10 23:59:59",
"consumerType": "user",
"consumerAmount": 1,
"description": "临时证书",
"licenseCheckModel": {
"ipAddress": ["10.86.37.169", "192.168.181.1", "192.168.159.1"],
"macAddress": ["4C-CC-6A-C7-8E-27","00-50-56-C0-00-01","00-50-56-C0-00-08"],
"cpuSerial": "BFEBFBFF000506E3"
}
}
5、启动效果