SMART Health Card令牌校验失败相关问题咨询
核心概念解释
什么是issuer set
issuer set(发行方密钥集)是SMART Health Cards校验SDK用来验证JWS签名的可信公钥集合,它会根据JWT payload中的iss(发行方地址)字段,匹配对应发行方公开的JWKS(JSON Web Key Set),再通过JWS header里的kid找到对应公钥完成验签,报错就是因为SDK找不到你指定kid对应的公钥。
什么是DEFLATE压缩
DEFLATE是一种通用无损数据压缩算法,SMART Health Cards规范明确要求JWS的payload必须先使用无gzip头、无校验和的raw DEFLATE格式压缩后再签名,你直接传入了未压缩的JSON字符串,所以SDK解压时触发错误。
报错解决步骤
三个报错按顺序修复即可:
修复JWS header missing 'zip' property错误
生成JWS时在header配置中新增zip: 'DEF'字段,标识payload采用DEFLATE压缩,修改createSign入参:
const token =await jose.JWS.createSign( {format: 'compact', zip: 'DEF'}, // 新增zip配置 key ).update(压缩后的payload, "utf8").final();
修复Error inflating JWS payload错误
先对JSON payload做raw DEFLATE压缩再签名,可借助pako库实现:
- 安装依赖:
npm install pako - 修改payload处理逻辑:
const pako = require('pako') const payload =JSON.stringify({ "iss" : "https://spec.smarthealth.cards/examples/issuer", "sub": "1234567890", "name": "John Doe", "iat": 1516239022}); // 执行raw DEFLATE压缩 const compressedPayload = pako.deflateRaw(payload)
修复can't find key with 'kid' in issuer set错误
根据使用场景选一种方案处理即可:
- 本地测试场景:手动指定本地发行方密钥集
- 新建
issuer-set.json文件,填入对应iss的公钥(注意删除私钥参数d,仅保留公钥参数):
{ "https://spec.smarthealth.cards/examples/issuer": { "keys": [ { "kty": "EC", "use": "sig", "crv": "P-256", "kid": "6d858102402dbbeb0f9bb711e3d13a1229684792db4940db0d0e71c08ca602e1", "x": "5R2yrryD1ztBYnyKyQF5r5kzPUjnVnmR5pMe7H9ykNU", "y": "VaqqjG0N2rSuijP9P9QiOjX4XEhIl8k8fzA6FZTSMhY", "alg": "ES256" } ] } }- 运行校验命令时新增参数指定本地密钥集:
node . --path C:\Users\User\Documents\Saguaro\health-cards-validation-SDK-main\jws.text --type jws --issuer-set ./issuer-set.json - 新建
- 生产场景:将你的公钥JWKS文件发布到
iss字段对应域名的.well-known/jwks.json路径,SDK会自动拉取对应公钥。
内容的提问来源于stack exchange,提问作者priyanka mane
相关产品推荐
相关产品推荐

