You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 3+中JWTEncoder无法选择JWK签名密钥问题排查

问题解决:Spring Boot 3 整合认证/资源服务器自定义共享密钥签名失败

问题根源

报错Failed to select a JWK signing key的核心原因是:配置的JWK(JSON Web Key)缺少**密钥用途(Key Use)和签名算法(Algorithm)**的元数据,导致授权服务器在筛选签名密钥时无法匹配到符合要求的密钥。

修复步骤

修改JwtEncoder配置中OctetSequenceKey的构建代码,补充密钥用途和算法声明:

@Bean
public JwtEncoder jwtEncoder() {
    byte[] keyBytes = Base64.getDecoder().decode(jwtSecret);
    SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "HmacSHA256");
    OctetSequenceKey octetKey = new OctetSequenceKey.Builder(secretKeySpec)
            .keyID("customKey")
            // 指定密钥用于签名
            .keyUse(KeyUse.SIGNATURE)
            // 指定签名算法为HS256(对应HmacSHA256)
            .algorithm(new Algorithm("HS256"))
            .build();
    JWKSet jwkSet = new JWKSet(octetKey);
    JWKSource<SecurityContext> jwkSource = (jwkSelector, context) -> {
        List<JWK> keys = jwkSelector.select(jwkSet);
        if (keys.isEmpty()) {
            System.out.println("No keys found matching selection criteria!");
        } else {
            System.out.println("Keys selected: " + keys.stream().map(JWK::getKeyID).collect(Collectors.joining(", ")));
        }
        return keys;
    };

    return new NimbusJwtEncoder(jwkSource);
}

关键说明

  • keyUse(KeyUse.SIGNATURE):明确该密钥用于JWT签名操作,授权服务器会根据这个标识筛选可用的签名密钥。
  • algorithm(new Algorithm("HS256")):指定密钥对应的签名算法为HmacSHA256(缩写HS256),与创建SecretKeySpec时指定的算法保持一致,确保编码器能匹配到正确的签名算法。

注:你的密钥长度符合要求,Base64解码后的密钥正好是32字节(256位),满足HmacSHA256的最小密钥长度要求。

内容的提问来源于stack exchange,提问作者xmlParser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 19:46:23