|  |  |  | 
|---|
|  |  |  | import org.apache.logging.log4j.Logger; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import java.io.File; | 
|---|
|  |  |  | import java.io.IOException; | 
|---|
|  |  |  | import java.nio.file.Files; | 
|---|
|  |  |  | import java.nio.file.Path; | 
|---|
|  |  |  | import java.text.DateFormat; | 
|---|
|  |  |  | import java.text.MessageFormat; | 
|---|
|  |  |  | import java.text.SimpleDateFormat; | 
|---|
|  |  |  | import java.util.Base64; | 
|---|
|  |  |  | import java.util.prefs.Preferences; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 安装License证书 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public synchronized LicenseContent install(LicenseVerifyParam param){ | 
|---|
|  |  |  | public synchronized LicenseContent install(LicenseVerifyParam param, String license) { | 
|---|
|  |  |  | LicenseContent result = null; | 
|---|
|  |  |  | DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //1. 安装证书 | 
|---|
|  |  |  | try{ | 
|---|
|  |  |  | LicenseManager licenseManager = LicenseManagerHolder.getInstance(initLicenseParam(param)); | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | LicenseParam licenseParam = initLicenseParam(param); | 
|---|
|  |  |  | LicenseManager licenseManager = LicenseManagerHolder.getInstance(licenseParam); | 
|---|
|  |  |  | licenseManager.uninstall(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | result = licenseManager.install(new File(param.getLicensePath())); | 
|---|
|  |  |  | logger.info(MessageFormat.format("许可证加载成功,许可证有效期:{0} - {1}",format.format(result.getNotBefore()),format.format(result.getNotAfter()))); | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | logger.error("许可证加载失败!",e); | 
|---|
|  |  |  | File tempFileFromBase64 = createTempFileFromBase64(license); | 
|---|
|  |  |  | result = licenseManager.install(tempFileFromBase64); | 
|---|
|  |  |  | logger.info(MessageFormat.format("许可证加载成功,许可证有效期:{0} - {1}", format.format(result.getNotBefore()), format.format(result.getNotAfter()))); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | logger.error("许可证加载失败!", e); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return result; | 
|---|
|  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 校验License证书 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public boolean verify(){ | 
|---|
|  |  |  | public boolean verify() { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | LicenseManager licenseManager = LicenseManagerHolder.getInstance(null); | 
|---|
|  |  |  | DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (!updateSystemTime()) { | 
|---|
|  |  |  | //时间更新失败,系统时间被更改 | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | LicenseContent licenseContent = licenseManager.verify(); | 
|---|
|  |  |  | logger.info(MessageFormat.format("许可证校验通过,许可证有效期:{0} - {1}",format.format(licenseContent.getNotBefore()),format.format(licenseContent.getNotAfter()))); | 
|---|
|  |  |  | logger.info(MessageFormat.format("许可证校验通过,许可证有效期:{0} - {1}", format.format(licenseContent.getNotBefore()), format.format(licenseContent.getNotAfter()))); | 
|---|
|  |  |  | return true; | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | logger.error("许可证校验失败!",e); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | logger.error("许可证校验失败!", e); | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 校验License证书并获取证书信息 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public LicenseContent getVerifyInfo(){ | 
|---|
|  |  |  | public LicenseContent getVerifyInfo() { | 
|---|
|  |  |  | LicenseManager licenseManager = LicenseManagerHolder.getInstance(null); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (!updateSystemTime()) { | 
|---|
|  |  |  | //时间更新失败,系统时间被更改 | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //校验证书 | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | LicenseContent licenseContent = licenseManager.verify(); | 
|---|
|  |  |  | return licenseContent; | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | logger.error("许可证校验失败!",e); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | logger.error("许可证校验失败!", e); | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 初始化证书生成参数 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param param License校验类需要的参数 | 
|---|
|  |  |  | * @return de.schlichtherle.license.LicenseParam | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | private LicenseParam initLicenseParam(LicenseVerifyParam param){ | 
|---|
|  |  |  | private LicenseParam initLicenseParam(LicenseVerifyParam param) { | 
|---|
|  |  |  | Preferences preferences = Preferences.userNodeForPackage(LicenseVerify.class); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | CipherParam cipherParam = new DefaultCipherParam(param.getStorePass()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | KeyStoreParam publicStoreParam = new CustomKeyStoreParam(LicenseVerify.class | 
|---|
|  |  |  | ,param.getPublicKeysStorePath() | 
|---|
|  |  |  | ,param.getPublicAlias() | 
|---|
|  |  |  | ,param.getStorePass() | 
|---|
|  |  |  | ,null); | 
|---|
|  |  |  | , param.getPublicKeysStorePath() | 
|---|
|  |  |  | , param.getPublicAlias() | 
|---|
|  |  |  | , param.getStorePass() | 
|---|
|  |  |  | , null); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return new DefaultLicenseParam(param.getSubject() | 
|---|
|  |  |  | ,preferences | 
|---|
|  |  |  | ,publicStoreParam | 
|---|
|  |  |  | ,cipherParam); | 
|---|
|  |  |  | , preferences | 
|---|
|  |  |  | , publicStoreParam | 
|---|
|  |  |  | , cipherParam); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 更新时间到注册表中 | 
|---|
|  |  |  | * 将Base64字符串转换为临时文件 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param base64String Base64编码的字符串 | 
|---|
|  |  |  | * @param filePrefix   文件名前缀(例如 "license_") | 
|---|
|  |  |  | * @param fileSuffix   文件后缀(例如 ".lic") | 
|---|
|  |  |  | * @return 生成的临时File对象(自动在JVM退出时删除) | 
|---|
|  |  |  | * @throws IOException | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | private boolean updateSystemTime() { | 
|---|
|  |  |  | // 获取用户根节点 | 
|---|
|  |  |  | Preferences userRoot = Preferences.userRoot(); | 
|---|
|  |  |  | // 获取指定路径下的节点 | 
|---|
|  |  |  | Preferences node = userRoot.node("/zhongyang"); | 
|---|
|  |  |  | String key = "time"; | 
|---|
|  |  |  | // 读取注册表 | 
|---|
|  |  |  | String value = node.get(key, null); | 
|---|
|  |  |  | if (value != null) { | 
|---|
|  |  |  | long originTime = Long.parseLong(value); | 
|---|
|  |  |  | long now = System.currentTimeMillis(); | 
|---|
|  |  |  | long diff = now - originTime;//现在时间 - 源时间 = 时间差 | 
|---|
|  |  |  | if (diff > 0) { | 
|---|
|  |  |  | //时间差大于0才允许更新注册表时间 | 
|---|
|  |  |  | node.put(key, String.valueOf(System.currentTimeMillis())); | 
|---|
|  |  |  | return true; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | // 写入注册表 | 
|---|
|  |  |  | node.put(key, String.valueOf(System.currentTimeMillis())); | 
|---|
|  |  |  | return true; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | public File base64ToTempFile(String base64String, String filePrefix, String fileSuffix) | 
|---|
|  |  |  | throws IOException { | 
|---|
|  |  |  | // 解码Base64 | 
|---|
|  |  |  | byte[] decodedBytes = Base64.getDecoder().decode(base64String); | 
|---|
|  |  |  | // 创建临时文件 | 
|---|
|  |  |  | Path tempPath = Files.createTempFile(filePrefix, fileSuffix); | 
|---|
|  |  |  | // 写入内容 | 
|---|
|  |  |  | Files.write(tempPath, decodedBytes); | 
|---|
|  |  |  | // 设置JVM退出时自动删除 | 
|---|
|  |  |  | tempPath.toFile().deleteOnExit(); | 
|---|
|  |  |  | return tempPath.toFile(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public File createTempFileFromBase64(String base64Data) throws IOException { | 
|---|
|  |  |  | return base64ToTempFile(base64Data, "temp_license_", ".bin"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|