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
相关产品推荐
相关产品推荐

