web-dev-qa-db-ja.com

Springブートセキュリティで公開鍵/秘密鍵を使用してJWT署名を作成および検証する

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」として使用する代わりに、公開鍵と秘密鍵を使用したい

5
user8363477
  • 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

キーを使用して、認証サーバーでトークンに署名します。

@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;
}
5
soyphea