該功能由[`TrueLicense`](https://truelicense.namespace.global/)封裝而來
> License,即版權許可證,一般用于收費軟件給付費用戶提供的訪問許可證明。根據應用部署位置的不同,一般可以分為以下兩種情況討論:
> * 1、應用部署在開發者自己的云服務器上。這種情況下用戶通過賬號登錄的形式遠程訪問,因此只需要在賬號登錄的時候校驗目標賬號的有效期、訪問權限等信息即可。
> * 2、應用部署在客戶的內網環境。因為這種情況開發者無法控制客戶的網絡環境,也不能保證應用所在服務器可以訪問外網,因此通常的做法是使用服務器許可文件,在應用啟動的時候加載證書,然后在登錄或者其他關鍵操作的地方校驗證書的有效性。
[TOC]
# 生成密鑰
```
@E:
@mkdir key
@cd key
# 1、KeyTool工具來生成密鑰對
# validity:私鑰的有效期多少天
# alias:私鑰別稱A
# keystore: 私鑰文件名B
# storepass:私鑰庫密碼C
# keypass:私鑰密碼D
@keytool -genkeypair -keysize 1024 -validity 3650 -alias "privateKey" -keystore "privateKeys.store" -storepass "FastBoot" -keypass "gotv" -dname "CN=GOTV, OU=GOTV, O=GOTV, L=WUHAN, ST=HUBEI, C=CN"
# 2、把私匙庫內的公匙導出到一個文件當中
# alias:私鑰別稱A
# keystore:私鑰文件名B
# storepass: 私鑰庫密碼C
# file:證書名稱
@keytool -exportcert -alias "privateKey" -keystore "privateKeys.store" -storepass "FastBoot" -file "certfile.cer"
# 3、再把這個證書文件導入到公匙庫
# alias:公鑰別稱E
# file:證書名稱
# keystore:公鑰文件名F
# storepass:私鑰庫密碼C
echo y | keytool -import -alias "publicCert" -file "certfile.cer" -keystore "publicCerts.store" -storepass "FastBoot"
@pause
```
注意:上述內容復制后新建后綴名bat文件,點擊運行后會在當前目錄下面得到三個文件
* privateKeys.keystore:私鑰,這個甲方備份,續期時使用,不能泄露給別人。
* publicCerts.keystore: 公鑰,這個乙方使用,驗證license文件里面的信息的。
* certfile.cer:證書文件,可以刪掉。
# 測試示例
```
@Test
public void creator() {
// 生效時間
Date issusedDate = new Date();
log.info("license generate issusedDate {}", format.format(issusedDate));
// 過期時間
Date expiryDate = DateUtils.addDays(issusedDate, 30);
log.info("license generate expiryDate {}", format.format(expiryDate));
// 額外信息
LicenseParamsExtra licenseExtraModel = new LicenseParamsExtra();
// 構造參數
LicenseParams params = new LicenseParams()
// 證書主題
.setSubject(subject)
// 密鑰庫密碼
.setStorePass(storepass)
// 私鑰路徑
.setPrivateKeysStorePath(LicenseHelperTest.class.getResource("privateKeys.store").getPath())
// 私鑰別稱
.setPrivateAlias("privateKey")
// 私鑰密碼
.setPrivatePass(privatepass)
// 證書生成路徑
.setLicensePath(LicenseHelperTest.class.getResource("license.lic").getPath())
// 證書生效時間
.setIssuedTime(issusedDate)
// 證書失效時間
.setExpiryTime(expiryDate)
// 額外信息
.setLicenseExtraModel(licenseExtraModel);
// 生成證書
LicenseCreator licenseCreator = new LicenseCreator(params);
log.info("license generate {}", licenseCreator.generateLicense() ? "success" : "fail");
}
@Test
public void verify() throws Exception {
// 證書信息
LicenseVerify param = new LicenseVerify()
// 證書主題
.setSubject(subject)
// 公鑰路徑
.setPublicKeysStorePath("E:/license/publicCerts.store")
// 公鑰別稱
.setPublicAlias("publicCert")
// 密鑰庫密碼
.setStorePass(storepass)
// 證書路徑
.setLicensePath("E:/license/license.lic");
// 安裝證書
param.install();
// 校驗證書
param.verify();
}
```
# 驗證結果
```
[FastBoot][ INFO][08-22 16:42:04]-->[main: 1436][creator(LicenseHelperTest.java:33)] | - license generate issusedDate 2020-08-22 16:42:04
[FastBoot][ INFO][08-22 16:42:04]-->[main: 1440][creator(LicenseHelperTest.java:36)] | - license generate expiryDate 2020-09-21 16:42:04
[FastBoot][ INFO][08-22 16:42:04]-->[main: 1603][creator(LicenseHelperTest.java:61)] | - license generate success
[FastBoot][ INFO][08-22 16:42:04]-->[main: 1401][install(LicenseVerify.java:92)] | - license install success
[FastBoot][ INFO][08-22 16:42:04]-->[main: 1424][verify(LicenseVerify.java:115)] | - license verify success 2020-08-22 16:42:04
- 2020-09-21 16:42:04
```
# 注意事項
```
[FastBoot][ INFO][08-22 19:01:13]-->[main: 3158][install(LicenseVerify.java:92)] | - license install success
[FastBoot][ INFO][08-22 19:01:13]-->[main: 3171][verify(LicenseVerify.java:115)] | - license verify success 2020-08-22 16:42:04
- 2020-09-21 16:42:04
```
后續會同步更新授權版本,與開源版如下不同
* 驗證證書,授權失敗終止進程
* 代碼混淆,混淆所有相關代碼