Commit d1444de6 by hy

项目初始化

parents
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store
.idea/
\ No newline at end of file
**生成私钥文件private.ks**
```bash
keytool -genkeypair -dname "CN=TBYF HIP" -alias standard -keystore private.ks -storepass "Esb@123$%^" -validity 3650
```
私钥文件密码: `Esb@123$%^`
**生成公钥文件public.ks**
导出证书
```bash
keytool -exportcert -keystore private.ks -alias standard -storepass "Esb@123$%^" -file digital.cert
```
导入证书
```bash
keytool -importcert -file digital.cert -keystore public.ks -alias standard -storepass "Tbyf@123456"
```
公钥文件密码: `Tbyf@123456`
**迁移jks(java keystore)格式至行业标准格式pkcs12**
```bash
keytool -importkeystore -srckeystore private.ks -destkeystore private.ks -deststoretype pkcs12
keytool -importkeystore -srckeystore public.ks -destkeystore public.ks -deststoretype pkcs12
```
File added
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tbyf.license</groupId>
<artifactId>license-spring-boot-starter</artifactId>
<version>0.0.1</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-boot.version>2.7.14</spring-boot.version>
<truelicense-v4.version>4.0.3</truelicense-v4.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>global.namespace.truelicense</groupId>
<artifactId>truelicense-v4</artifactId>
<version>${truelicense-v4.version}</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package com.tbyf.license;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConditionalOnWebApplication
public class LicenseAutoConfiguration {
@Bean
public LicenseManager licenseManager() {
return new LicenseManager();
}
@Bean
public FilterRegistrationBean<LicenseValidationFilter> licenseFilter() {
FilterRegistrationBean<LicenseValidationFilter> registrationBean = new FilterRegistrationBean<>();
LicenseValidationFilter filter = new LicenseValidationFilter();
filter.setLicenseManager(licenseManager());
registrationBean.setFilter(filter);
registrationBean.addUrlPatterns("/**");
return registrationBean;
}
}
package com.tbyf.license;
import global.namespace.fun.io.bios.BIOS;
import global.namespace.truelicense.api.ConsumerLicenseManager;
import global.namespace.truelicense.api.License;
import global.namespace.truelicense.api.LicenseManagementContext;
import global.namespace.truelicense.api.LicenseManagementException;
import global.namespace.truelicense.api.LicenseValidationException;
import global.namespace.truelicense.core.passwd.ObfuscatedPasswordProtection;
import global.namespace.truelicense.obfuscate.ObfuscatedString;
import global.namespace.truelicense.v4.V4;
public class LicenseManager {
private static final String SUBJECT = "HIP";
private static final String KEY_STORE_FILE = "public.ks";
private static final LicenseManagementContext _managementContext = V4
.builder()
.validation(license -> verifyMAC(license.getExtra()))
.subject(SUBJECT)
.build();
volatile ConsumerLicenseManager _manager;
private static void verifyMAC(Object MAC) throws LicenseValidationException {
if (MAC == null || !NetUtil.containsMAC(MAC.toString())) {
throw new LicenseValidationException(Messages.message("Invalid License"));
}
}
ConsumerLicenseManager manager() {
ConsumerLicenseManager m = this._manager;
return null != m ? m : (this._manager = newManager());
}
private ConsumerLicenseManager newManager() {
return _managementContext
.consumer()
.encryption()
.protection(protection(new long[]{0x9d823a2b21bef869L, 0x4f4790eaa895d3d8L}))
.up()
.authentication()
.alias("standard")
.loadFromResource(KEY_STORE_FILE)
.storeProtection(protection(new long[]{0x10111721aeba73dcL, 0x1aba2dc58b17fdbeL, 0x126b920ac6703949L}))
.up()
.storeInUserPreferences(getClass())
.build();
}
private static ObfuscatedPasswordProtection protection(long[] longs) {
return new ObfuscatedPasswordProtection(new ObfuscatedString(longs));
}
public void verify() throws Exception {
manager().verify();
}
public void install(String licensePath) throws Exception {
manager().install(BIOS.file(licensePath));
}
public void uninstall() throws Exception {
manager().uninstall();
}
public LicenseValidPeriod getLicenseValidPeriod() throws LicenseManagementException {
License license = manager().load();
LicenseValidPeriod period = new LicenseValidPeriod();
period.setStartTime(license.getNotBefore());
period.setExpirationTime(license.getNotAfter());
return period;
}
}
package com.tbyf.license;
import lombok.Data;
import java.util.Date;
@Data
public class LicenseValidPeriod {
private Date startTime;
private Date expirationTime;
}
package com.tbyf.license;
import global.namespace.truelicense.obfuscate.ObfuscatedString;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LicenseValidationFilter extends OncePerRequestFilter {
private LicenseManager licenseManager;
// Invalid License
private final static String INVALID_LICENSE =
new ObfuscatedString(new long[]{
0x49e5266592028869L, 0x9315b379de60a1beL, 0xe1fde0262ab5ed27L,
0xde54ce8a8e5d4e19L, 0x42880fae5dbb8a13L, 0x7dc34d7fb839ec0dL,
0x99a3515ef60c84a5L, 0xc708fcab8319dfb3L}).toString();
// No License
private final static String NO_LICENSE =
new ObfuscatedString(new long[]{
0x8cb7df8f04d69f43L, 0xd616159bdf90a5eL, 0x508a735a1546f8bcL,
0x7925f6557e460d53L, 0x4667e92ce4bcef22L, 0x359b5eefb590ca78L,
0x239eba55236200f0L}).toString();
public void setLicenseManager(LicenseManager licenseManager) {
this.licenseManager = licenseManager;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
try {
this.licenseManager.verify();
}
catch (Exception e) {
response.setStatus(HttpStatus.FORBIDDEN.value());
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
response.getWriter().write(INVALID_LICENSE);
}
}
}
package com.tbyf.license;
import global.namespace.truelicense.api.i18n.Message;
import java.util.Locale;
public class Messages {
public static Message message(String msg) {
return new Message() {
@Override
public String toString() {
return msg;
}
@Override
public String toString(Locale locale) {
return msg;
}
};
}
}
package com.tbyf.license;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class NetUtil {
private static volatile Set<String> cache;
public static boolean containsMAC(String MAC) {
return getAllMACs().contains(MAC.toUpperCase());
}
private static Set<String> getAllMACs() {
Set<String> allMACs = cache;
if (allMACs != null && !allMACs.isEmpty()) {
return allMACs;
}
return (cache = fetchAllMACs());
}
private static Set<String> fetchAllMACs() {
try {
Enumeration<NetworkInterface> ifcs = NetworkInterface.getNetworkInterfaces();
Set<String> allMACs = new HashSet<>();
while (ifcs.hasMoreElements()) {
NetworkInterface ifc = ifcs.nextElement();
byte[] macBytes = ifc.getHardwareAddress();
String[] MAC = new String[6];
if (macBytes != null && macBytes.length == 6) {
for (int i = 0; i < macBytes.length; i++) {
MAC[i] = String.format("%02x", macBytes[i]).toUpperCase();
}
allMACs.add(String.join("-", MAC));
}
}
System.out.println(allMACs);
return allMACs;
}
catch (SocketException e) {
return Collections.emptySet();
}
}
}
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.tbyf.license.LicenseAutoConfiguration
\ No newline at end of file
package com.tbyf.license;
import global.namespace.fun.io.api.NoContentException;
import global.namespace.truelicense.api.LicenseManagementException;
import global.namespace.truelicense.api.LicenseValidationException;
import org.junit.jupiter.api.Test;
class LicenseManagerTest {
@Test
void uninstall() throws Exception {
new LicenseManager().uninstall();
}
@Test
void install() throws Exception {
new LicenseManager().install("hip.lic");
}
@Test
void getLicenseValidPeriod() throws LicenseManagementException {
System.out.println(new LicenseManager().getLicenseValidPeriod());
}
@Test
void verify() throws Exception {
LicenseManager licenseManager = new LicenseManager();
try {
licenseManager.verify();
System.out.println();
}
catch (LicenseValidationException e) {
System.out.println("无效证书");
}
catch (LicenseManagementException e) {
if (e.getCause() instanceof NoContentException) {
System.out.println("证书未安装");
}
else {
e.printStackTrace();
}
}
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment