OpenPGP.js读取公钥无法获取全部6条notation,出现重复条目
OpenPGP.js读取公钥Notation字段缺失/重复问题解析
问题背景
使用OpenPGP.js(v5.11.2、v6测试版,浏览器和Node.js环境均复现)读取包含6条proof@ariadne.id类型notation的armored格式公钥时,在key[0].users[0].selfCertifications中仅能获取到4条notation,且其中两条内容重复。但通过GPG的showpref命令可正常查看全部6条notation。
可能原因&排查方向
1. OpenPGP.js的解析逻辑特性
OpenPGP.js对notation的处理逻辑和GPG存在差异:
- 它可能默认合并了内容完全一致的notation条目(包含
name和value的大小写、特殊字符等细节),但GPG允许重复条目存在 - 若部分notation带有
critical标记,OpenPGP.js可能跳过了解析这类标记的条目
2. 公钥签名结构问题
公钥的self-certification可能由多个签名块组成:
- GPG会合并所有self-signature中的notation,但OpenPGP.js可能仅解析了第一个self-signature内的内容,剩余notation可能存在于
selfCertifications数组的其他元素中,建议遍历整个数组排查,不要仅查看第一个元素
3. 操作层面的疏漏
- 检查
readKeys调用时是否传入了过滤参数,是否限制了解析字段导致notation被过滤 - 确认armored公钥未被截断,可通过GPG重新导出一份干净的公钥再进行测试
验证步骤
- 用GPG导出二进制格式公钥:
gpg --export --output pubkey.bin [你的密钥ID],再用OpenPGP.js读取该二进制密钥,对比结果是否一致 - 遍历
key[0].users[0].selfCertifications的每一项,逐个查看每个签名内的notation列表 - 打印每条notation的完整属性(
name、value、critical、humanReadable),确认是否存在被忽略的细节差异
内容的提问来源于stack exchange,提问作者NyaightHazard
相关产品推荐
相关产品推荐

