2017-12-08 7 views
0

春のブートセキュリティで公開鍵と秘密鍵を使用してJWT署名を作成および検証するプロセスについて知りたいと思います。スプリングブートセキュリティで公開鍵/秘密鍵を使用してJWT署名を作成して確認する

HMACアルゴリズムを使用してJWTトークンを検証しようとしています。私はハードコードされた秘密の "MYSECRET"でJWTを構築しています。コードを解析するための

Jwts.builder() 
       .setClaims(claims) 
       .setSubject(subject) 
       .setAudience(audience) 
       .setIssuedAt(createdDate) 
       .setExpiration(expirationDate) 
       .signWith(SignatureAlgorithm.HS512, "MYSECRET") 
       .compact() 

代わりに「MYSECRET」として署名キーを使用しての

Jwts.parser() 
       .setSigningKey("MYSECRET") 
       .parseClaimsJws(token) 
       .getBody(); 

を次のようになり、私は、公開鍵と秘密鍵の使用

+0

あなたのコードはスプリングセキュリティを使用していません。スプリングで使用できる 'jjwt'ライブラリを使用しています。あるいは、スプリングには独自のJWT実装があります。鍵ペアを使用するようにコードを適合させるか、すべてを再実装しますか? – pedrofb

答えて

-1
  • はJKSを生成したいと思いますJava KeyStoreファイル

最初に鍵を生成しましょう。 ifically .jksファイル - コマンドラインツールのkeytoolを使用して:

のkeytool -genkeypair -aliasのMyTest -keyalg RSA -keypass MYPASS -keystore mytest.jks -storepass MYPASS

  • 公開鍵をエクスポートする

keytool - リスト-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; 
} 
+0

OAuthを使用してこれを行う方法はありますか? – user8363477

+0

Oauth2はJWTを使用できます(または使用しない)が、非対称鍵ペア – pedrofb

+0

JWTを使用してJWT認証システムを実装する必要はありません。ステートレスと呼んだのは、リソースがデータベース内のトークンをチェックする必要がないため、キーが十分であることを確認するだけなので、アプリケーションのスケーラビリティを向上させることができます。 – soyphea

関連する問題