1、pom依赖
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.9.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.2.9.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-security</artifactId>
        <version>2.2.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>com.auth0</groupId>
        <artifactId>java-jwt</artifactId>
        <version>4.2.1</version>
    </dependency>
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.12.5</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
 
 
2、JwtTokenUtil工具类
package com.nancal.util;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import org.apache.tomcat.util.codec.binary.Base64;
import org.springframework.core.io.ClassPathResource;
import org.springframework.security.rsa.crypto.KeyStoreKeyFactory;
import java.security.KeyPair;
import java.security.PublicKey;
import java.security.interfaces.RSAPrivateKey;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
 * JWT工具类
 *
 * @since 2024-05-11
 * @author zhouwb
 *
 */
public class JwtTokenUtil {
    /**
     * token过期时间
     * 24小时
     */
    private static final long EXPIRE_TIME = 24 * 60 * 60 * 1000;
    // 证书文件
    private static String keyLocation = "pdm.jks";
    // 秘钥库密码
    private static String keystorePassword = "Gacrnd#123";
    // 秘钥密码
    private static String keypassword = "Gacrnd#123";
    // 秘钥别名
    private static String alias = "pdm";
    /**
     * 获取jwt token
     *
     * 签名选用PS512算法
     * RSA算法
     * @return
     */
    public static String getJwtToken() {
        // 访问证书路径
        ClassPathResource resource = new ClassPathResource(keyLocation);
        //密钥工厂
        KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(resource, keystorePassword.toCharArray());
        // 密钥对(私钥和公钥)
        KeyPair keyPair = keyStoreKeyFactory.getKeyPair(alias, keypassword.toCharArray());
        // 私钥
        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
        Map<String, String> payLoadMap = new HashMap<>();
        // 一个系统用一个唯一标识,默认iDME
        payLoadMap.put("userId", "iDME");
        payLoadMap.put("userName", "sysadmin");
        // 设置过期时间
        Date expirDate = new Date(System.currentTimeMillis() + EXPIRE_TIME);
        String token = Jwts.builder()
                .claims(payLoadMap)
                .expiration(expirDate)
                .issuedAt(new Date())
                .signWith(privateKey, Jwts.SIG.PS512)
                .compact();
        return token;
    }
    /**
     * 校验
     *
     * @param token
     * @return
     */
    public static Claims verify (String token) {
        // 访问证书路径
        ClassPathResource resource = new ClassPathResource(keyLocation);
        //秘钥工厂
        KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(resource, keystorePassword.toCharArray());
        // 秘钥对(秘钥和公钥)
        KeyPair keyPair = keyStoreKeyFactory.getKeyPair(alias, keypassword.toCharArray());
        PublicKey publicKey = keyPair.getPublic();
        Claims payload = Jwts.parser()
                .verifyWith(publicKey)
                .build()
                .parseSignedClaims(token)
                .getPayload();
        return payload;
    }
    /**
     * 获取公钥
     *
     * @return
     */
    public static String getPublicKey() {
        // 访问证书路径
        ClassPathResource resource = new ClassPathResource(keyLocation);
        //秘钥工厂
        KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(resource, keystorePassword.toCharArray());
        // 秘钥对(秘钥和公钥)
        KeyPair keyPair = keyStoreKeyFactory.getKeyPair(alias, keypassword.toCharArray());
        String publicKey = Base64.encodeBase64String(keyPair.getPublic().getEncoded());
        return publicKey;
    }
    /**
     * 获取私钥
     *
     * @return
     */
    public static String getPrivateKey() {
        // 访问证书路径
        ClassPathResource resource = new ClassPathResource(keyLocation);
        //秘钥工厂
        KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(resource, keystorePassword.toCharArray());
        // 秘钥对(秘钥和公钥)
        KeyPair keyPair = keyStoreKeyFactory.getKeyPair(alias, keypassword.toCharArray());
        String privateKey = Base64.encodeBase64String(keyPair.getPrivate().getEncoded());
        return privateKey;
    }
}
 
3、JwtApplication 启动类
package com.nancal;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class,
        ManagementWebSecurityAutoConfiguration.class})
public class JwtApplication {
    public static void main(String[] args) {
        SpringApplication.run(JwtApplication.class, args);
    }
}
 
4、JwtController控制器
package com.nancal.controller;
import com.nancal.util.JwtTokenUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/jwt")
public class JwtController {
    @GetMapping("/token")
    public Map search() {
        String jwtToken = JwtTokenUtil.getJwtToken();
        Map<String, String> resultMap = new HashMap<>();
        resultMap.put("token", jwtToken);
        resultMap.put("state", "success");
        return resultMap;
    }
}
 
5、秘钥文件pdm.jks

5、测试




















