keytool -genkeypair -alias shiyou -keyalg RSA -keypass shiyou -keystore shiyou.jks -storepass shiyou
安装 openSSL
http://slproweb.com/products/Win32OpenSSL.html
keytool
-list -rfc --keystore
shiyou.jks |
openssl
x509
-inform
pem
-pubkey
公钥
我们使用私钥,生成令牌
@Test
public void testCreateJwt() throws JsonProcessingException {
String keyLocation = "shiyou.jks";
String keyPassword = "shiyou";
ClassPathResource resource = new ClassPathResource(keyLocation);
//存储密钥的工厂对象
KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(resource,keyPassword.toCharArray());
//密钥对(公钥对应私钥)
KeyPair keyPair = keyStoreKeyFactory.getKeyPair("shiyou","shiyou".toCharArray());
//私钥
RSAPrivateKey privateKey = (RSAPrivateKey)keyPair.getPrivate();
//自定义载荷payload信息
Map<String ,Object> tokenMap = new HashMap<>();
tokenMap.put("name","zzj");
tokenMap.put("roles","admin,User");
//使用工具类,通过私钥颁发JWT令牌
Jwt jwt = JwtHelper.encode(new ObjectMapper().writeValueAsString(tokenMap),new RsaSigner(privateKey));
String token = jwt.getEncoded();
System.out.println(token);
}
使用公钥对令牌进行验证,注意这里的
-----BEGIN PUBLIC KEY-----
-----END PUBLIC KEY-----
不能少
@Test
public void testVerify(){
//token是上面生成的令牌
String token = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlcyI6ImFkbWluLFVzZXIiLCJuYW1lIjoienpqIn0.FtPYKtiVxTO8jfkPwdxv-QRFvsSpNQWWhqxMbSq-sV2fCVsnLn_nv1GjZcYcoaRwEzc4i28BfE3gfGPxZbTzrvXt2DcGJuA1CHWX1ICcwyO4kE13phVdkJ4i00ETBidoIw3nXrLrx91MNoXhX9Y-coXmcXEzxoJ5BNON9e2qDvFh-I5XtoAqZIH5KXsOBE1vzV0XyD1Y3EqF4aQQiwRW1YcxqHsZ2cg90N87zmME8VmmWechcK_p-aiy_lQgwGAQZfkGI0NO97LSWklOjvfkUz9GwXpOJKxuc9Pny3hF4z7AQg1Oz7bLMrNbmCA6_qhr-gX1wT6kvMtX3UHCQTRLEQ";
// 这是公钥,通过OpenSSL导出来的
String public_key = "-----BEGIN PUBLIC KEY-----\n" +
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkZ3LhJZgjEo0oqIV5RBW\n" +
"1yokRK+sJdQ/O2zf7hsIOnBaywcM+XT9WGgzaq+zbTYmaLuXyaBuuFLWbk5dJUlY\n" +
"XGc0qDWCkfcprE8cZe7yNoaKhGEnonF/CMFPstGqh0XdP2vn9k4U/OxGK0FsfJtd\n" +
"bLt+gELD8AW//TvAkG7t5A0YVVlnJ4PJgT4QuomwhgPDcocn/NHzOMBZArkOcAK7\n" +
"toufb6lHLOd9yROYnwls9nrwwwcpCYBieS4/7UWo73xzfwIuvNqMNOf/qPbXQfTC\n" +
"WS/I1aAtg+vJnpXb8WqUHtnFdFcXShM7VCW/3q1YRrAlNv82GM2Aefnr05sr/f/5\n" +
"NwIDAQAB\n" +
"-----END PUBLIC KEY-----";
//校验令牌
Jwt jwt = JwtHelper.decodeAndVerify(token,new RsaVerifier(public_key));
String claims = jwt.getClaims(); //获取令牌中的载荷信息
System.out.println(claims);
}