关于Java:在Spring Boot Security中使用公钥/私钥创建和验证JWT签名

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;
}