【问题标题】:Where do i have to put the JOSE header when creating JWS signature?创建 JWS 签名时,我必须将 JOSE 标头放在哪里?
【发布时间】:2021-01-24 10:42:37
【问题描述】:

我必须创建一个 JWS 签名,并且 JOSE 标头必须如下所示:

{
  "alg": "HS256",
  "kid": "V3vEe66RJm85eD72",
  "b64": false,
  "http://openbanking.org.uk/iat": 1501497671,
  "http://openbanking.org.uk/iss": "C=UK, ST=England, L=London, O=Acme Ltd.",
  "crit": ["b64","http://openbanking.org.uk/iat","http://openbanking.org.uk/iss"]
}

我必须在哪里将此标头放在jwt.io 网站中,或者有人知道其他创建 jws 签名的好网站吗? 问题是,当我使用文档提供的标头类型更改 jwt.io 中默认存在的标头时,它在 jwt.io 底部的“无效签名”中说,为什么?

【问题讨论】:

  • 您是否让 x-jws-signature 标头工作?我正在使用 Java,并且在我的程序中成功签名并验证了签名,但是 OB 服务器返回它无法验证签名。

标签: jwt json-web-signature


【解决方案1】:

您可以将标题添加到jwt.io 调试器右栏的“HEADER”部分。

然后您在“验证签名”下的字段中添加一个秘密并获得一个令牌。 您的 JOSE Header 包含 crit 声明,这会导致“无效签名”:

“crit”(关键)标头参数表示扩展为 必须使用此规范和/或 [JWA] 理解和处理。它的值是一个列出 Header 的数组 JOSE Header 中使用这些扩展的参数名称。 如果任何列出的扩展头参数不被理解 并得到收件人支持,则JWS无效

签名本身没问题,只是critclaim 会导致签名无效错误。只要您有一个带有非空列表的crit 声明,jwt.io 上的验证就会失败。

您可以验证生成的令牌

eyJhbGciOiJIUzI1NiIsImtpZCI6IlYzdkVlNjZSSm04NWVENzIiLCJiNjQiOmZhbHNlLCJodHRwOi8vb3BlbmJhbmtpbmcub3JnLnVrL2lhdCI6MTUwMTQ5NzY3MSwiaHR0cDovL29wZW5iYW5raW5nLm9yZy51ay9pc3MiOiJDPVVLLCBTVD1FbmdsYW5kLCBMPUxvbmRvbiwgTz1BY21lIEx0ZC4iLCJjcml0IjpbImI2NCIsImh0dHA6Ly9vcGVuYmFua2luZy5vcmcudWsvaWF0IiwiaHR0cDovL29wZW5iYW5raW5nLm9yZy51ay9pc3MiXX0.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIn0.QrI016I1j2kKE-cth3xr8O5DUOLOrL-biUfkuVZb_Xo P>

(使用秘密“秘密”创建) 在https://www.jsonwebtoken.io/ 上查看是否可以验证。该网站似乎不关心 crit 标头,仅基于散列进行检查。 (注意:本网站在解码后不会显示正确的令牌标头和有效负载)

一般来说,您不应该太认真地对待这些在线工具。它们用于测试和教育目的,而不是作为生产工具。

【讨论】:

  • 如何将标题放在站点jsonwebtoken.io 中?如何删除默认存在的标题?
  • 似乎不可能
  • 我必须使用 RS256 算法创建,工作方式相同?
  • @juniordevjim 是的,至少你可以在 jwt.io 上创建一个 RS256 签名的令牌。您需要提供签名的私钥。但是 jsonwebtoken.io 似乎除了 HS256 之外什么都不能处理。
  • @juniordevjim 但是,您为什么不编写几行nodes.js/javascript、python 或任何适合您的最佳代码,而不是处理这些网站?它非常简单灵活。
猜你喜欢
  • 2013-10-30
  • 2014-07-06
  • 2021-09-29
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 2011-09-18
相关资源
最近更新 更多