使用Nodejs解码欧盟新冠护照时报Unknown tag 18错误如何解决
错误原因
你调用了错误的COSE消息处理接口:欧盟新冠护照中封装的是COSE_Sign1类型的签名消息,对应的CBOR标签号就是报错信息中的18;而你使用的cose.encrypt.read是用来处理加密类型的COSE消息,自然无法识别标签18,触发报错。
解决方法
1. 替换COSE处理方法
将cose.encrypt.read替换为专门处理COSE_Sign1消息的cose.sign1.read接口,如果你不需要验证证书签名合法性,可以新增配置跳过签名校验,避免需要传入签发公钥的问题。
2. 补充CBOR解码逻辑
从COSE结构中提取的payload是CBOR编码的结构化数据,不是普通UTF8文本,需要额外解码才能拿到可读的健康证书信息。
修改后可运行的代码示例
const base45 = require("base45"); const zlib = require("zlib"); const cose = require("cose-js"); const cbor = require("cbor"); // 需额外执行 npm install cbor 安装 const passport = "HC1:NCFO..."; // 移除HC1:前缀 const payload = passport.slice(4); // Base45解码 const decoded = base45.decode(payload); // 解压数据,如果inflateSync报错可以替换为zlib.inflateRawSync尝试 const decompressed = zlib.inflateSync(decoded); cose.sign1.read(decompressed, { // 跳过签名校验,如需验证证书合法性可替换为对应签发机构的公钥配置 skipVerification: true }) .then((payloadBuf) => { // CBOR解码拿到结构化的健康证书数据 const healthCert = cbor.decodeFirstSync(payloadBuf); console.log("健康证书内容:", healthCert); }) .catch((error) => { console.log("处理失败:", error); });
额外说明
如果需要验证证书的有效性,你需要获取欧盟各成员国公开的新冠证书签发公钥,传入cose.sign1.read的配置项中替换skipVerification参数即可完成验签。
内容的提问来源于stack exchange,提问作者Simon H
相关产品推荐
相关产品推荐

