首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >智能健康卡令牌验证失败

智能健康卡令牌验证失败
EN

Stack Overflow用户
提问于 2021-07-13 04:39:06
回答 1查看 603关注 0票数 2

我正在编写下面的代码以获得jwt令牌,我想用智能健康卡验证SDK验证它

代码语言:javascript
复制
var jose = require("node-jose");
const {JWS} = require("node-jose");


async function a1(){
    try {
    
const keystore={
    keys: [
        {
            kty: 'EC',
            d: 'gLkNmSBFWR67hEu62eVfVWhFbLGl309jOszsocqbexE',
            use: 'sig',
            crv: 'P-256',
            kid: '6d858102402dbbeb0f9bb711e3d13a1229684792db4940db0d0e71c08ca602e1',
            x: '5R2yrryD1ztBYnyKyQF5r5kzPUjnVnmR5pMe7H9ykNU',
            y: 'VaqqjG0N2rSuijP9P9QiOjX4XEhIl8k8fzA6FZTSMhY',
            alg: 'ES256'
        }
    ]
}

const ks = await jose.JWK.asKeyStore(keystore);
const rawKey = ks.get(keystore.keys[0].kid)
const key =  await jose.JWK.asKey(rawKey);

const payload =JSON.stringify({ "iss" : "https://spec.smarthealth.cards/examples/issuer", "sub": "1234567890", "name": "John Doe", "iat": 1516239022});

    const token =await jose.JWS.createSign( {format: 'compact'},key).update(payload, "utf8").final();

    console.log(token);
    }catch (err) {
    console.log(err);
  }
    
}
a1();

我得到了钱:

eyJhbGciOiJFUzI1NiIsImtpZCI6IjZkODU4MTAyNDAyZGJiZWIwZjliYjcxMWUzZDEzYTEyMjk2ODQ3OTJkYjQ5NDBkYjBkMGU3MWMwOGNhNjAyZTEifQ.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkVyaWMgRC4iLCJyb2xlIjoiYWRtaW4iLCJpYXQiOjE1MTYyMzkwMjJ9.dbjb9YHFCWaFYGQYyGDDL1iFvqk1Ed9k3-PAhVx4NtvFml1q0VcpW854IXW_J47f6Vf1otm2WeftVQHjY3K4vg

当我使用这个命令时:

代码语言:javascript
复制
node . --path C:\Users\User\Documents\Saguaro\health-cards-validation-SDK-main\jws.text --type jws

在sdk文件中,我得到以下错误:

错误 │·JWS头缺少'zip‘属性。 │·错误膨胀JWS有效载荷。你用过未经处理的压缩吗? │不正确标头检查 JWS验证失败:在发行者集中找不到“│”=│的密钥

请让我知道什么发行人的集合和如何把孩子的价值在发行人的集合。此外,什么是所谓的泄气压缩和如何消除这个问题。请注意:以上是伪码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-13 10:53:29

基本上有两个主要错误:

第一个错误(我将这两条消息视为一个错误的一部分)

·JWS头缺少“zip”属性。 ·膨胀JWS有效载荷的错误。你用过未经处理的压缩吗?

意味着您的令牌格式不正确。

Smart 需要压缩有效载荷 (参见RFC1951)算法和一个值为"DEF“的"zip”头来显示有效负载是压缩的,这是我只在JWE RFC中看到的,而不是针对JWS的。大多数JWT库可能不会为签名的令牌提供减缩的有效负载,节点jose也只支持JWE,因此必须手动完成。

为此,可以使用zlib压缩有效负载并手动将"zip":"DEF"添加到标头:

代码语言:javascript
复制
const zlib = require("zlib");
...
const payload = "{...}"  // very long payload, see example in https://mikkel.ca/blog/digging-into-quebecs-proof-of-vaccination/
const payloadBuf = zlib.deflateRawSync(payload)
const token =await jose.JWS.createSign({alg: 'ES256', fields: { zip: 'DEF' }, format: 'compact'}, key).update(payloadBuf, "utf8").final();

第二个错误是:

JWS验证失败:在发行者集中找不到带有‘can’= 6d858102402dbbeb0f9bb711e3d13a1229684792db4940db0d0e71c08ca602e1的密钥

这意味着,为了验证您的令牌,需要由给定的keyId (kid)标识的公钥,该密钥应该在您的“发行者集”中提供。

根据链接文件,验证器工具有一个参数

代码语言:javascript
复制
 -k, --jwkset <key>         path to trusted issuer key set

下面描述为: JSON密钥(JWK)集,编码颁发者的公开签名密钥

因此,基本上,您必须将密钥存储作为JWKS (JSON Web密钥集)存储在文件中(例如,JSON Web密钥集),如下所示,并在参数中提供该文件的路径。在您的令牌验证期间,验证器将从令牌头读取kid,并尝试在提供的密钥集中找到相应的密钥。

代码语言:javascript
复制
{
  "keys":
    [
      {
        "kty": "EC",
        "kid": "6d858102402dbbeb0f9bb711e3d13a1229684792db4940db0d0e71c08ca602e1",
        "use": "sig",
        "alg": "ES256",
        "crv": "P-256",
        "x"  : "SVqB4JcUD6lsfvqMr-OKUNUphdNn64Eay60978ZlL74",
        "y"  : "lf0u0pMj4lGAzZix5u4Cm5CMQIgMNpkwy163wtKYVKI"
      }
    ]
}

注意:不包括d值(私钥),您应该只显示公钥。

我下载了套餐,向有效载荷中添加了更多必需的数据(示例发现了这里),测试了它,并首先得到了上述错误,在提供参数--jwkset issuerPublicKeys.json之后,该错误消失了。

代码语言:javascript
复制
node . --path jws.txt --type jws --jwkset issuerPublicKeys.json

这意味着,jwt可以使用公钥进行验证!

还可以验证密钥集本身:

代码语言:javascript
复制
node . --type jwkset --path issuerPublicKeys.json

使用当前值,结果将是:

验证密钥集 │ └─错误 · key6d858102402dbbeb0f9bb711e3d13a1229684792db4940db0d0e71c08ca602e1:>‘#en0#’不匹配发出者键中的拇指指纹。预期:7qE0Y0DyqeOFFREIQSLKfu5WlbckdxVXKFasfcI-DG,实际: 6d858102402dbbeb0f9bb711e3d13a1229684792db4940db0d0e71c08ca602e1 验证已完成

上面提到的指纹和那个孩子一模一样。因此,当您用值"a7qE0Y0DyqeOFFREIQSLKfu5WlbckdxVXKFasfcI-Dg",替换孩子时,错误就消失了:

验证密钥集 验证已完成

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68356564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档