在给定JWS(JWT)标头的情况下,是否有在JWKS密钥库中选择签名验证密钥的标准方法?
我的目标是实施OpenID Connect ID令牌验证库,我试图灵活并预测不同的配置,但我不确定如果密钥选择特定于IdP,是否有一点要做反正。
我当前的算法遍历JWKS并过滤掉:
这种方法是否足够标准"?
===编辑===
我发现有Section 10.1的OpenID Connect核心规范说:
使用RSA或ECDSA签名时,JOSE标头的alg标头参数值必须设置为JSON Web算法[JWA]中定义的适当算法。用于签署内容的私钥必须与发件人在其JWK集文档中发布的用于签名验证的公钥相关联。如果引用的JWK Set文档中有多个键,则必须在JOSE标题中提供一个kid值。各个键的关键用法必须支持签名。
JWK"使用"是强制性的,所以我可以安全地要求它是" sig"。
JWT"孩子"如果JWKS中有多个密钥,则是强制性的。这表明(虽然是间接的)在这种情况下,JWT" kid"和" JWK"小孩应该匹配。 "小子"不需要是唯一的,所以你仍然需要额外的规则。
答案 0 :(得分:0)
我在项目中使用了类似的方法。 查看文件https://github.com/Spomky-Labs/jose/blob/master/src/Object/BaseJWKSet.php#L169
的方法selectKey
简而言之,方法根据参数对键进行排序并返回第一个。
答案 1 :(得分:0)
这是一种可行的方法。我认为在第5阶段,如果在JWS中没有传输kid
,则可能最终得到了多个相同类型的有效密钥(步骤4)。您可以循环遍历这些密钥,并将它们一次一个地传递给验证功能,以查明是否有一个成功并因此用于签署消息。