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

