近期开发的web应用交付海外客户试用时,领导要求需要限制客户的试用期限,于是考虑使用license进行授权。查阅相关资料,了解到一个开源的证书管理引擎——TrueLicense,通过TrueLicense可以实现授权验证功能,用于license的生成和有效性的验证。
# 一、License授权和验证的原理 > - 首先,需要生成密钥对,生成方法有很多,本次项目使用的是JDK提供的KeyTool工具; > - 在服务端,也就是授权者通过私钥(授权者保留,不能泄露)对包含授权信息(如起始日期、截止日期,服务器硬件的MAC地址等)的license进行数字签名; > - 在客户端,也就是软件的使用方,通过公钥(一般放在验证的代码中使用)验证license是否符合使用条件。 二、实现步骤
1.生成密钥对
1.1.生成私钥库
安装jdk,并配置环境变量,然后使用KeyTool工具生成密钥对,命令如下:
1
| keytool -genkeypair -keysize 1024 -validity 3650 -alias SYSHLANG -keystore privateKeys.keystore -storepass 12345678A -keypass 12345678A -dname "CN=syshlang, OU=syshlang, O=syshlang, L=GZ, ST=GD, C=CN"
|
参数说明:
- keysize 密钥长度
- validity 私钥的有效期(单位:天)
- alias 私钥别称
- keystore 指定私钥库文件的名称(生成在当前目录)
- storepass 指定私钥库的密码(keystore文件存储密码)
- keypass 指定别名条目的密码(私钥加解密密码)
- dname 证书个人信息
- CN为你的姓名
- OU为你的组织单位名称
- O为你的组织名称
- L为你所在的城市名称
- ST为你所在的省份名称
- C为你的国家名称
1.2.导出公钥
这一步主要是把私钥库内的公匙导出到一个文件中,命令如下:
1
| keytool -exportcert -alias SYSHLANG -keystore privateKeys.keystore -storepass 12345678A -file certfile.cer
|
参数说明:
- alias 私钥别称
- keystore 指定私钥库文件的名称(如果没有带路径,在当前目录查找)
- storepass 指定私钥库的密码
- file 导出证书文件名称
1.3.导入证书文件
这一步主要是把上一步中导出的证书文件导入到公钥库中,命令如下:
1
| keytool -import -alias SYSHLANG -file certfile.cer -keystore publicCerts.keystore -storepass 12345678A
|
参数说明:
- alias 公钥别称
- file 证书文件名称
- keystore 公钥文件名称
- storepass 指定私钥库的密码
是否信任此证书? [否]:" ,那么请输入"Y";此步骤中如果没有storepass会提示输入输入密钥库口令,输入之前设置的即可,如果没有设置口令,则输入信任证书默认密钥“changeit”。
如果顺利通过以上的步骤,会在当前目录下生成三个文件:
- certfile.cer 认证证书,已经没用了,可以删掉
- privateKeys.keystore 私钥,授权者保留,不能泄露
- publicCerts.keystore 公钥,给客人使用(一般放在验证的代码中使用)
此时,可以查看cacerts中的证书列表
1 2
| keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit // 查看所有 keytool -list -alias SYSHLANG -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit // 查看指定别名
|
删除cacerts中指定名称的证书
1
| keytool -delete -alias SYSHLANG -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit
|
2.使用TrueLicense实现授权验证
2.1服务端生成授权证书
TrueLicense默认只帮我们验证了时间,可以自定义加入一些需要验证的其它信息,例如,服务器硬件的MAC地址、CPU序列号等。然后调用私钥(privateKeys.keystore)生成授权证书文件(license.lic)。
1 2 3
| public class LicenseCreateParam implements Serializable { }
|
具体代码实现,可以点击服务端代码链接查看。
2.2客户端验证授权证书
在客户端,继承LicenseManager类,重写verify方法,校验自定义加入一些需要验证的其它信息。将公钥(publicCerts.keystore)放在项目中,将授权证书文件(license.lic)放到对应的路径即可。
1 2 3 4 5 6
| public class ClientLicenseManager extends LicenseManager { @Override protected synchronized LicenseContent verify(LicenseNotary licenseNotary) throws LicenseContentException { } }
|
具体代码实现,可以点击客户端代码链接查看。