You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 11:09:03