一、 License许可证创建
通过Java的密钥和证书管理工具keytool 生成私钥PrivateKeys.keystore、证书certfile.cer、公钥PublicCerts.store,再通过程序读取私钥生成许可证license.lic,程序读取许可证进行验证来实现软件授权。
1. 私钥、证书、公钥生成
需切换到JDK的JDK\jre\bin目录下执行。
1.1 生成私钥PrivateKeys.keystore
设置privateKeys(别名)生成路径, 设置keypass、storepass密码,-dname指定证书拥有者信息 例如:"CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区域名称,ST=州或省份名称,C=单位的两字母国家代码"
1. keytool -genkey -alias privateKeys -keypass xxxxxx -keyalg DSA -keysize 1024 -validity 365 -keystore D://PrivateKeys.keystore -storepass xxxxxx -dname "CN=xxxxxx , OU=xxxxxx , O=xxxxxx , L=HD, S=BJ, C=zh" |
1.2 生成证书certfile.cer
设置certfile.cer、PrivateKeys.keystore存储路径,导出privateKeys
1. keytool -export -alias privateKeys -file D://certfile.cer -keystore D://PrivateKeys.keystore |
1.3 生成公钥PublicCerts.store
1. keytool -import -alias publiccert -file D://certfile.cer -keystore D://PublicCerts.store |
2. 许可证生成
2.1 配置文件说明setparam.properties
1. ##########common parameters########### 2. #alias privateKeys (私钥的别名) 3. PRIVATEALIAS=privateKeys 4. #key(important!)(该密码生成密钥对的密码,需要妥善保管,不能让使用者知道) 5. KEYPWD=xxxxxx 6. #STOREPWD(该密码是在使用keytool生成密钥对时设置的密钥库的访问密码) 7. STOREPWD=xxxxxx 8. #SUBJECT(项目的唯一识别码) 9. SUBJECT=xxxxxx 10. #licPath(生成证书的地址) 11. licPath=D://license.lic 12. #priPath(私钥密钥库的地址) 13. priPath=PrivateKeys.keystore 14. ##########license content########### 15. #issuedTime(发布日期) 16. issuedTime=2019-09-11 17. #notBeforeTime(有效开始日期) 18. notBefore=2019-09-11 19. #notAfterTime(有效截止日期) 20. notAfter=2019-09-12 21. #ip address 22. ipAddress=192.168.1.111 23. #mac address(机器物理地址MAC地址,“-”隔开) 24. macAddress=AA-BB-CC-DD-EE-FF 25. #consumerType 26. consumerType=User 27. #ConsumerAmount 28. consumerAmount=1 29. #info 30. info=this is a license |
2.2 生成许可证license.lic
执行licenseCreate-1.0.jar,生成license.lic
执行命令
1. java -jar licenseCreate-1.0.jar |
执行结果如下成功
1. 读取资源文件路径为:外部 的 setparam.properties 2. 读取资源文件路径为:外部 的 PrivateKeys.keystore 3. 操作系统为:windows 10 4. CPUID:XXXXXXXXXXXXXXXX 5. create license file successfully |
许可证保存在setparam.properties配置的licPath路径下license.lic文件
二、 License许可证验证
1. 配置文件说明verifyparam.properties
1. ##########common parameters########### 2. #alias 3. PUBLICALIAS=publiccert 4. #STOREPWD 5. STOREPWD=xxxxxx 6. #SUBJECT 7. SUBJECT=xxxxxx 8. #licPath(验证证书的地址) 9. licPath=D:/license.lic 10. #pubPath(公钥密钥库的地址) 11. pubPath=PublicCerts.store |
2. 验证许可证license.lic
执行licenseVerify-1.0.jar,验证license.lic
执行命令
1. java -jar licenseVerify-1.0.jar |
执行结果成功如下:
1. propertiesPath=verifyparam.properties 2. 读取资源文件路径为:外部 的 verifyparam.properties 3. 读取资源文件路径为:外部 的 D:/license.lic 4. 读取资源文件路径为:外部 的 D:/PublicCerts.store 5. Instal path:D:/license.lic 6. mac=AA-BB-CC-DD-EE-FF 7. 操作系统为:windows 10 8. CPUID:XXXXXXXXXXXXXXXX 9. License file instal successfully! 10. mac=AA-BB-CC-DD-EE-FF 11. 操作系统为:windows 10 12. CPUID:XXXXXXXXXXXXXXXX 13. License file verify successfully! 14. 证书有效 |
执行结果失败如下:
1. propertiesPath=verifyparam.properties 2. 读取资源文件路径为:外部 的 verifyparam.properties 3. 读取资源文件路径为:外部 的 D:/license.lic 4. 读取资源文件路径为:外部 的 D:/PublicCerts.store 5. Instal path:D:/license.lic 6. License file instal failure 7. 证书无效 |
三、 程序中使用license验证
- 授权,通过执行licenseCreate-1.0.jar在授权机器上生成许可证lic,再通过执行licenseVerify-1.0.jar验证生成的license.lic,验证通过,机器授权成功。
- 授权成功此lic可用,程序可以使用该文件进行授权。
1. 程序具体引用授权如下:
- 引用licenseVerify-1.0.jar
- 配置文件properties,公钥PublicCerts.store放入到程序中
- 通过程序代码调用验证,true验证成功,false验证失败。
代码如下:
1. /** 2. * 许可证验证 3. * 4. * @author zhangkx 5. * @version 2019-9-2 11:08:51 6. * @return true验证成功 7. */ 8. public static boolean licenseVerify() { 9. RequestVerifyLicense vLicense = new RequestVerifyLicense(); 10. boolean licenseVerifyStatus = false; 11. try { 12. vLicense.setParam("verifyparam.properties"); 13. // vLicense.setParam("src/main/resourceserifyparam.properties"); 14. licenseVerifyStatus = vLicense.verify(); 15. if (licenseVerifyStatus) { 16. System.out.println("证书有效"); 17. } else { 18. System.out.println("证书无效"); 19. } 20. } catch (Exception er) { 21. System.out.println(er.getMessage()); 22. } 23. return licenseVerifyStatus; 24. } |