syshlang基于TrueLicense实现web应用的License验证 | 枪口下的砚台

枪口下的砚台

所谓拥有,皆非束缚;所有过往,皆为序章。

0%

基于TrueLicense实现web应用的License验证

    近期开发的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 12345678 -keypass 12345678 -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 12345678 -file certfile.cer

参数说明:

  • alias 私钥别称
  • keystore 指定私钥库文件的名称(如果没有带路径,在当前目录查找)
  • storepass 指定私钥库的密码
  • file 导出证书文件名称

1.3.导入证书文件

    这一步主要是把上一步中导出的证书文件导入到公钥库中,命令如下:

1
keytool -import -alias publiccert -file certfile.cer -keystore publicCerts.store  -storepass 12345678

参数说明:

  • alias 公钥别称
  • file 证书文件名称
  • keystore 公钥文件名称
  • storepass 指定私钥库的密码

    是否信任此证书? [否]:” ,那么请输入”Y”;此步骤中如果没有storepass会提示输入输入密钥库口令,输入之前设置的即可,如果没有设置口令,则输入信任证书默认密钥“changeit”。

    如果顺利通过以上的步骤,会在当前目录下生成三个文件:

  • certfile.cer 认证证书,已经没用了,可以删掉
  • privateKeys.keystore 私钥,授权者保留,不能泄露
  • publicCerts.store 公钥,给客人使用(一般放在验证的代码中使用)

    此时,可以查看cacerts中的证书列表

1
keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts"  -storepass changeit

    删除cacerts中指定名称的证书

1
keytool -delete -alias publiccert -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.store)放在项目中,将授权证书文件(license.lic)放到对应的路径即可。

1
2
3
4
5
6
public class ClientLicenseManager extends LicenseManager {
@Override
protected synchronized LicenseContent verify(LicenseNotary licenseNotary) throws LicenseContentException {
// 重写verify方法,校验自定义信息
}
}

    具体代码实现,可以点击客户端代码链接查看。

------------- The End -------------
  • 本文作者: syshlang
  • 本文链接: https://www.syshlang.com/45cf44f/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!