在给定JWT标题的情况下在JWKS中选择一个键

时间:2016-09-09 12:37:21

标签: security jwt openid-connect jwk

在给定JWS(JWT)标头的情况下,是否有在JWKS密钥库中选择签名验证密钥的标准方法?

我的目标是实施OpenID Connect ID令牌验证库,我试图灵活并预测不同的配置,但我不确定如果密钥选择特定于IdP,是否有一点要做反正。

我当前的算法遍历JWKS并过滤掉:

  1. 如果JWK使用"使用"字段拒绝如果"使用"不等于" sig"
  2. 如果JWK有" key_ops"字段拒绝,如果" key_ops"不包含"验证"
  3. 如果JWK有" alg"字段拒绝,如果它与JWS标题值不同
  4. 如果JWS标题有" kid"如果JWK没有或具有不同的值(注意反向逻辑)
  5. ,则拒绝字段
  6. 如果在这个阶段只剩下一个JWK,我会使用那个。否则就是失败。
  7. 这种方法是否足够标准"?

    ===编辑===

    我发现有Section 10.1的OpenID Connect核心规范说:

      

    使用RSA或ECDSA签名时,JOSE标头的alg标头参数值必须设置为JSON Web算法[JWA]中定义的适当算法。用于签署内容的私钥必须与发件人在其JWK集文档中发布的用于签名验证的公钥相关联。如果引用的JWK Set文档中有多个键,则必须在JOSE标题中提供一个kid值。各个键的关键用法必须支持签名。

    JWK"使用"是强制性的,所以我可以安全地要求它是" sig"。

    JWT"孩子"如果JWKS中有多个密钥,则是强制性的。这表明(虽然是间接的)在这种情况下,JWT" kid"和" JWK"小孩应该匹配。 "小子"不需要是唯一的,所以你仍然需要额外的规则。

2 个答案:

答案 0 :(得分:0)

我在项目中使用了类似的方法。 查看文件https://github.com/Spomky-Labs/jose/blob/master/src/Object/BaseJWKSet.php#L169

的方法selectKey

简而言之,方法根据参数对键进行排序并返回第一个。

答案 1 :(得分:0)

这是一种可行的方法。我认为在第5阶段,如果在JWS中没有传输kid,则可能最终得到了多个相同类型的有效密钥(步骤4)。您可以循环遍历这些密钥,并将它们一次一个地传递给验证功能,以查明是否有一个成功并因此用于签署消息。