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

Hyperledger Fabric区块提取客户端签名及验证失败问题求助

问题:Hyperledger Fabric交易签名验证失败

在Hyperledger Fabric中,客户端使用私钥对交易进行签名。我尝试从区块中获取该签名,并使用客户端公钥进行验证,但验证始终返回false,需要解决方法。

从区块获取签名的Node.js代码

let getBlockByTX = await blockContract.evaluateTransaction("GetBlockByTxID", channelName, txId);
const resultJson = BlockDecoder.decode(getBlockByTX);
let signaturePRVKey =resultJson.data.data[0].signature;

签名输出结果

signaturePRVKey in base64 format
MEUCIQC330iICU/FP1XCIsYIHl4e6ytuS9niir/J7lZ5J5kYegIgF0zvjObCXMnrJfA+QXzIbbuJfJfx0ld+Wv6GknSX3fg=

signaturePRVKey in hex format
3045022100b7df4888094fc53f55c222c6081e5e1eeb2b6e4bd9e28abfc9ee56792799187a0220174cef8ce6c25cc9eb25f03e417cc86dbb897c97f1d2577e5afe86927497ddf8

签名验证代码(使用jsrsasign库)

const data = [
    "p1","Alice","F","alice@gmail.com","02156874652",
]

var sig = new KJUR.crypto.Signature({ "alg": "SHA256withECDSA" });
sig.init(certificatePEM);

sig.updateString(data)
var isValid = sig.verify(signaturePRVKey)
console.log(isValid)

解决方法

  • 匹配正确的原始签名数据:Fabric客户端签名的并非你自定义的data数组,而是交易的完整Proposal Payload(包含通道头、签名头、交易体等结构化数据)。你需要从区块中提取对应交易的原始签名数据,而非手动构造字段数组。
  • 确保签名格式兼容:
    • 若使用Base64格式签名,需先解码为二进制数据,或确认jsrsasign版本支持直接传入Base64字符串;
    • 你输出的十六进制签名为ASN.1 DER格式,可直接作为verify方法的参数传入。
  • 核对签名算法一致性:确认客户端签名使用的哈希算法与验证时一致,Fabric默认用SHA256withECDSA,若客户端配置了SHA3需同步调整alg参数。
  • 验证证书有效性:确保certificatePEM是签名客户端的有效证书,证书中的公钥必须与签名私钥配对,且证书未过期、未被吊销。
  • 确认签名字段正确性:核对Fabric区块结构,确保resultJson.data.data[0].signature确实是客户端对交易的签名,部分场景下签名可能嵌套在payload.header.signature_header字段中。

内容的提问来源于stack exchange,提问作者Mallika

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 05:35:21