JwtAccessTokenConverter:无法从 verifierKey 创建 RSA 验证程序

Nel*_*ves 5 spring-security spring-boot spring-security-oauth2 spring-cloud-security

我有一个使用 Spring Cloud OAuth2 的授权服务器 Spring Boot 项目。我将这些 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());
}
Run Code Online (Sandbox Code Playgroud)

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

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

我该如何摆脱这个警告?

jcc*_*ero 4

AJwtAccessTokenConverter可以配置为使用 MAC 密钥或 RSA 密钥对来生成和验证签名。

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

正如您在的源代码中看到的,在尝试创建签名验证JwtAccessTokenConverter时会发出警告: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)");
}
Run Code Online (Sandbox Code Playgroud)

RsaVerifier 构造函数中会引发异常,因为它尝试将验证密钥解析为 RSA 公钥,而您可能正在使用 MAC 密钥:

public RsaVerifier(String key) {
  this(RsaKeyHelper.parsePublicKey(key.trim()), RsaSigner.DEFAULT_ALGORITHM);
}
Run Code Online (Sandbox Code Playgroud)

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

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

如果您实际上正在使用 RSA 密钥,则可以使用setVerifierKeysetKeyPair方法来提供加密 RSA 材料。