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

node-forge无法验证OpenSSL生成的签名,ASN.1字节不足错误怎么解决?

问题

我使用OpenSSL命令生成签名:

openssl pkeyutl -in mess.txt -out sign.txt -inkey priv.pem -sign

然后用以下node-forge脚本验证签名:

const fs = require('fs');
const forge = require('node-forge');

function verifySignature(publicKeyPem, message, signatureFile) {
  try {
    const publicKey = forge.pki.publicKeyFromPem(publicKeyPem);
    const signatureBytes = fs.readFileSync(signatureFile,'binary');

    const md = forge.md.sha256.create();
    md.update(message);

    const verified = publicKey.verify(md.digest().getBytes(), signatureBytes);

    if (verified) {
      console.log('Signature is valid. Message is authenticated.');
    } else {
      console.error('Signature is invalid. Message could not be authenticated.');
    }
  } catch (error) {
    console.error('Error during signature verification:', error);
  }
}

const publicKeyPem = fs.readFileSync('pub.pem', 'utf-8');
const messageToSign = fs.readFileSync('mess.txt', 'utf-8');
const signatureFile = 'sign.txt';

verifySignature(publicKeyPem, messageToSign, signatureFile);

执行时出现错误:

Error: Too few bytes to read ASN.1 value.

请问该如何解决?


解决办法

核心原因

OpenSSL的pkeyutl -sign默认生成原始(raw)格式签名,而node-forge的publicKey.verify方法默认期望的是ASN.1/DER编码的签名,格式不匹配导致ASN.1解析失败。

方案一:修改OpenSSL命令生成兼容格式签名

签名时添加-pkeyopt digest:sha256参数,生成符合PKCS#1 v1.5标准的ASN.1编码签名:

openssl pkeyutl -in mess.txt -out sign.txt -inkey priv.pem -sign -pkeyopt digest:sha256

重新生成签名后,原验证脚本无需修改即可正常运行。

方案二:修改node-forge脚本适配原始签名

如果无法重新生成签名,可在调用verify方法时指定签名格式为raw:

// 替换原verify调用行
const verified = publicKey.verify(md.digest().getBytes(), signatureBytes, 'raw');

额外注意事项

  • 确保消息文件读取编码正确:如果mess.txt是二进制文件,不要用utf-8编码读取,避免内容被篡改:
    const messageToSign = fs.readFileSync('mess.txt', 'binary');
    
  • 确认密钥对匹配:priv.pem和pub.pem必须是同一密钥对生成的,否则验证必然失败。

内容的提问来源于stack exchange,提问作者Văn Tiệp Hoàng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:10:24