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
相关产品推荐
相关产品推荐

