Creating and Verifying JWT signature using public/private key in Spring boot security
我想知道在Spring Boot安全性中使用公钥和私钥创建和验证JWT签名的过程。
我正在尝试使用HMAC算法验证JWT令牌。我正在使用硬编码的机密" MYSECRET"构建JWT。
1 2 3 4 5 6 7 8 | Jwts.builder() .setClaims(claims) .setSubject(subject) .setAudience(audience) .setIssuedAt(createdDate) .setExpiration(expirationDate) .signWith(SignatureAlgorithm.HS512,"MYSECRET") .compact() |
用于解析的代码如下
1 2 3 4 | Jwts.parser() .setSigningKey("MYSECRET") .parseClaimsJws(token) .getBody(); |
我不想使用签名密钥作为" MYSECRET ",而是想使用公共密钥和私有密钥
- 生成JKS Java KeyStore文件
首先使用命令行工具keytool生成密钥-更具体地说是.jks文件:
keytool -genkeypair -alias mytest
-keyalg RSA
-keypass mypass
-keystore mytest.jks
-storepass mypass
- 导出您的公钥
keytool -list -rfc --keystore mytest.jks | openssl x509 -inform pem
-pubkey
使用密钥在授权服务器中签名令牌。
1 2 3 4 5 6 7 8 9 | @Bean public JwtAccessTokenConverter accessTokenConverter(){ JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource("mytest.jks"),"mypass".toCharArray()); converter.setKeyPair(keyStoreKeyFactory.getKeyPair("mytest")); return converter; } |
最后在资源服务器中使用您的公钥。
1 2 3 4 5 6 7 8 9 10 11 12 13 | @Bean public JwtAccessTokenConverter accessTokenConverter() { JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); Resource resource = new ClassPathResource("public.txt"); String publicKey = null; try { publicKey = IOUtils.toString(resource.getInputStream()); } catch (final IOException e) { throw new RuntimeException(e); } converter.setVerifierKey(publicKey); return converter; } |