1、进入jdk安装目录:cd C:\Program Files\Java\jdk1.8.0_291
2、执行命令:
keytool -genkeypair -alias jwt -keyalg RSA -keypass 123456 -keystore f:\black\jwt.jks -storepass 123456
3、备份
keytool -importkeystore -srckeystore f:\black\jwt.jks -destkeystore f:\black\jwt.jks -deststoretype pkcs12
4、 查询证书
keytool -list -keystore f:\black\jwt.jks
5、获取公钥:public key
keytool -list -rfc --keystore f:/black/jwt.jks | openssl x509 -inform pem -pubkey
6、编写测试类
package com.senge.ali.auth.util;
import cn.hutool.json.JSONUtil;
import com.google.common.collect.Maps;
import org.springframework.core.io.ClassPathResource;
import org.springframework.security.jwt.Jwt;
import org.springframework.security.jwt.JwtHelper;
import org.springframework.security.jwt.crypto.sign.RsaSigner;
import org.springframework.security.jwt.crypto.sign.RsaVerifier;
import org.springframework.security.rsa.crypto.KeyStoreKeyFactory;
import java.security.KeyPair;
import java.security.interfaces.RSAPrivateKey;
import java.util.Map;
public class JwtTest {
/**
* 获取token
* @throws Exception
*/
public static String testCreateJwt() throws Exception {
// 1、创建秘钥工厂
KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(
// 秘钥位置
new ClassPathResource("jwt.jks"),
// 秘钥库密码
"123456".toCharArray()
);
// 2、基于工厂拿到私钥
KeyPair keyPair = keyStoreKeyFactory.getKeyPair("jwt", "123456".toCharArray());
// 转化为rsa私钥
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
// 3、生成jwt
Map<String, String> map = Maps.newHashMap();
map.put("username", "senge");
map.put("password", "123456");
Jwt jwt = JwtHelper.encode(JSONUtil.toJsonStr(map), new RsaSigner(rsaPrivateKey));
String jwtEncoded = jwt.getEncoded();
System.out.println("jwtEncoded:" + jwtEncoded);
String claims = jwt.getClaims();
System.out.println("claims:" + claims);
return jwtEncoded;
}
/**
* 解析token
* @throws Exception
*/
public static void testParseJwt(String jwtToken) throws Exception {
// 基于公钥去解析jwt
String publicKey = "-----BEGIN PUBLIC KEY-----\n" +
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgRV9PliWWPM8vBm9WG/X\n" +
"w2IikbtLsYGYBmAu366cP5FsJzo9USWnCx3lwk9oEgmT6KBNRZj54WZAWX7QJivD\n" +
"ohjxiNghj5rBFH9tOVEoGS/wQK5tu9rEbAGwZdy8BtOYdKk6c0uarP6uEnLxEkWy\n" +
"evRkX3Ph4Lqb8XBTqxWbIKm0etiCjSfznz46+1fpIVDN//3R6TYs1RxlyiznIJ+l\n" +
"zFEj3VFTvTcDyaFw2KYHLQ9MmqSv52SldIf2VO8jdoQ3J7cc7Vv3AKiHCXh2dqBV\n" +
"WkBFSqddEh/Hi9uD2M/qyTLUtwV8sjoFk0Xu0q5i8ALMqdwVBEfLrNnvv+VS/9y+\n" +
"jwIDAQAB\n" +
"-----END PUBLIC KEY-----";
// 解析令牌
Jwt token = JwtHelper.decodeAndVerify(jwtToken, new RsaVerifier(publicKey));
// 获取负载
String claims = token.getClaims();
System.out.println(claims);
}
public static void main(String[] args) throws Exception {
String token = testCreateJwt();
testParseJwt(token);
}
}