JwtAccessTokenConverter:无法从 verifierKey 创建 RSA 验证器

JwtAccessTokenConverter: Unable to create an RSA verifier from verifierKey

我有一个授权服务器 Spring 使用 Spring Cloud OAuth2 的引导项目。我将这些 bean 用于 JWT:

@Bean
public JwtAccessTokenConverter accessTokenConverter() {
    JwtAccessTokenConverter tokenConverter = new JwtAccessTokenConverter();
    tokenConverter.setSigningKey("my-test-jwt-secret");
    return tokenConverter;
}

@Bean
public JwtTokenStore tokenStore() {
    return new JwtTokenStore(accessTokenConverter());
}

登录显然工作正常,但是当我 运行 项目时,我收到此警告:

WARN 16804 --- [main] o.s.s.o.p.t.s.JwtAccessTokenConverter    : Unable to create an RSA verifier from verifierKey (ignoreable if using MAC)

如何摆脱这个警告?

可以将 JwtAccessTokenConverter 配置为使用 MAC 密钥或 RSA 密钥对进行签名生成和验证。

正如警告中提供的消息所述,您可能使用的是 MAC 密钥而不是 RSA 密钥对。因此,它可能不会假设有问题,但恐怕由于库的实现方式,您无法摆脱警告。

正如您在 JwtAccessTokenConvertersource code 中所见,尝试创建 RsaVerifier 进行签名验证时发出警告:

SignatureVerifier verifier = new MacSigner(verifierKey);
try {
  verifier = new RsaVerifier(verifierKey);
}
catch (Exception e) {
  logger.warn("Unable to create an RSA verifier from verifierKey (ignoreable if using MAC)");
}

异常在 RsaVerifier constructor 中引发,因为它正在尝试将验证密钥解析为 RSA public 密钥,而您可能正在使用 MAC键改为:

public RsaVerifier(String key) {
  this(RsaKeyHelper.parsePublicKey(key.trim()), RsaSigner.DEFAULT_ALGORITHM);
}

在这里,RsaKeyHelper 将尝试将提供的密钥解析为既不是 ssh 密钥也不是 pem 密钥,因为它实际上不是那种类型的密钥。

假定此验证密钥的值与作为 MAC 密钥的 setSigningKey method 参数的签名密钥提供的值相同。

如果您实际使用 RSA 密钥,您可以使用 setVerifierKey or setKeyPair 方法来提供加密 RSA material。