SpringBootセキュリティで公開鍵と秘密鍵を使用してJWT署名を作成および検証するプロセスを知りたいです。
HMACアルゴリズムを使用してJWTトークンを検証しようとしています。ハードコードされたシークレット「MYSECRET」を使用してJWTを構築しています。
Jwts.builder()
.setClaims(claims)
.setSubject(subject)
.setAudience(audience)
.setIssuedAt(createdDate)
.setExpiration(expirationDate)
.signWith(SignatureAlgorithm.HS512, "MYSECRET")
.compact()
コードを解析する場合は次のとおりです
Jwts.parser()
.setSigningKey("MYSECRET")
.parseClaimsJws(token)
.getBody();
署名鍵を「MYSECRET」として使用する代わりに、公開鍵と秘密鍵を使用したい
まず、コマンドラインツール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
キーを使用して、認証サーバーでトークンに署名します。
@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;
}
最後に、リソースサーバーで公開鍵を使用します。
@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;
}