1. License 认证:这玩意儿是干啥的?
有效期:这个 License 什么时候到期,控制软件的使用时长。 硬件绑定:比如限制只能在指定服务器上运行,避免拷贝到其他设备上乱用。
2. 开始搞密钥:授权者生成密钥对
keytool
命令行工具来完成,但为了方便,也可以在代码里实现生成。# 生成密钥库,别忘了 -alias 参数指定别名
keytool -genkey -alias licenseKey -keyalg RSA -keystore privateKeys.keystore -keysize 2048 -validity 3650
privateKeys.keystore
,保存到本地就行。这个密钥库中包含一个私钥,用于生成 License 证书。接下来导出公钥,这样使用者就可以用它来验证证书的合法性。# 导出公钥
keytool -export -alias licenseKey -keystore privateKeys.keystore -file publicCert.cer
publicCert.cer
会提供给使用方,用于在验证时进行“解密”操作,判断 License 的合法性。3. 生成 License 证书
java-license-manager
或类似的依赖来生成 License。先加上 Maven 依赖:<dependency>
<groupId>com.github.java-license-manager</groupId>
<artifactId>license-manager</artifactId>
<version>1.0.0</version>
</dependency>
签发日期:什么时候签的 到期日期:有效期到什么时候 描述信息:如公司名、授权的设备 ID 等(我们今天只讲有效期验证,可以不加)
public class LicenseGenerator {
public void generateLicense() {
// 设置参数
LicenseParam licenseParam = new LicenseParam();
licenseParam.setSubject("software-license");
licenseParam.setIssued(new Date());
licenseParam.setNotAfter(new Date(System.currentTimeMillis() + 365L * 24 * 60 * 60 * 1000)); // 一年有效期
// 设置密钥库
KeyStoreParam keyStoreParam = new KeyStoreParam();
keyStoreParam.setKeyStorePath("path/to/privateKeys.keystore");
keyStoreParam.setAlias("licenseKey");
keyStoreParam.setPassword("your-keystore-password");
// 创建 License
LicenseManager licenseManager = new LicenseManager(licenseParam, keyStoreParam);
licenseManager.createLicense("path/to/license.lic");
System.out.println("License 文件生成成功!");
}
}
KeyStoreParam
指定了密钥库路径、别名、和密码等,用于生成合法的 License 文件,生成后会输出到指定路径,比如 license.lic
。4. 使用方配置:License 验证
license-manager
依赖,然后编写 License 验证类:public class LicenseValidator {
public boolean validateLicense() {
try {
LicenseParam licenseParam = new LicenseParam();
licenseParam.setSubject("software-license");
KeyStoreParam publicKeyStoreParam = new KeyStoreParam();
publicKeyStoreParam.setKeyStorePath("path/to/publicCert.cer");
LicenseManager licenseManager = new LicenseManager(licenseParam, publicKeyStoreParam);
LicenseContent licenseContent = licenseManager.verifyLicense("path/to/license.lic");
// 验证 License 是否在有效期内
Date now = new Date();
return now.before(licenseContent.getNotAfter());
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
publicCert.cer
,用它去验证 license.lic
的合法性。通过 verifyLicense()
方法获取到的 LicenseContent
,其中包含了 License 的详细内容,我们可以通过有效期字段进行检查。5. 项目启动时安装证书
@SpringBootApplication
public class LicenseApplication implements CommandLineRunner {
@Autowired
private LicenseValidator licenseValidator;
public static void main(String[] args) {
SpringApplication.run(LicenseApplication.class, args);
}
@Override
public void run(String... args) {
if (!licenseValidator.validateLicense()) {
System.out.println("License 无效或已过期,系统即将退出。");
System.exit(1);
} else {
System.out.println("License 验证通过,启动系统。");
}
}
}
validateLicense()
,如果 License 无效,系统将直接退出。大伙儿一定要测试下,确保证书有效才能顺利启动系统。6. 加个拦截器,再稳一手
@Component
public class LicenseInterceptor implements HandlerInterceptor {
@Autowired
private LicenseValidator licenseValidator;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (!licenseValidator.validateLicense()) {
response.sendError(HttpStatus.FORBIDDEN.value(), "License 无效或已过期");
return false;
}
return true;
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private LicenseInterceptor licenseInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(licenseInterceptor).addPathPatterns("/**");
}
}
-END-
ok,今天先说到这,老规矩,看完文章记得右下角给何老师点赞,
最后送给大家一个福利,我这里有一份搞副业的教程,这份教程里有100+个搞钱小项目:
网盘拉新核心玩法、公众号运营变现、小红书虚拟资料引流等,现在扫码加我微信,即可领取这份副业教程。
添加时备注:副业