无法使用Fireblocks生成的RSA密钥创建Hedera测试网客户端求助
问题分析与解决方案
核心问题
Hedera原生不支持将RSA密钥直接作为账户操作密钥使用,它仅支持ED25519或**ECDSA(secp256k1/secp256r1)**算法的密钥对。你用Fireblocks生成的4096位RSA私钥不符合Hedera客户端的密钥格式要求,所以会触发invalid private key length错误。
你的尝试为什么无效
PrivateKey.fromPem()和PrivateKey.fromStringDerPem()方法仅能解析Hedera支持的ED25519/ECDSA密钥的PEM/DER格式,无法处理RSA密钥,因此转换格式也无法解决问题。
正确解决路径
方案1:生成Hedera兼容的密钥(推荐)
在Fireblocks中为你的Hedera账户生成ED25519或ECDSA类型的私钥,而非RSA密钥。Fireblocks支持直接生成符合Hedera要求的密钥对,生成后用以下代码初始化客户端:
const { Client, AccountId, PrivateKey } = require("@hashgraph/sdk"); const fs = require("fs"); async function initHederaClient() { // 替换为你的Hedera账户ID const operatorIdStr = "0.0.XXXXXX"; // 读取Fireblocks生成的ED25519/ECDSA私钥PEM文件 const operatorKeyStr = fs.readFileSync("hedera-private-key.pem", "utf8"); const operatorId = AccountId.fromString(operatorIdStr); const operatorKey = PrivateKey.fromPem(operatorKeyStr); const client = Client.forTestnet().setOperator(operatorId, operatorKey); console.log("客户端初始化成功"); return client; } initHederaClient().catch(console.error);
方案2:通过Fireblocks API处理RSA签名(合规需求场景)
如果因企业合规必须使用RSA密钥,不能直接用RSA密钥初始化Hedera客户端,需通过Fireblocks API完成交易签名:
const { Client, AccountId, TransferTransaction } = require("@hashgraph/sdk"); const axios = require("axios"); async function sendTransactionViaFireblocks() { const client = Client.forTestnet(); const operatorId = AccountId.fromString("0.0.XXXXXX"); // 仅设置操作账户ID,不直接传入密钥 client.setOperatorAccountId(operatorId); // 创建测试转账交易 const transaction = await new TransferTransaction() .addHbarTransfer(operatorId, -1) .addHbarTransfer(AccountId.fromString("0.0.YYYYYY"), 1) .freezeWith(client); // 获取待签名的交易字节 const transactionBytes = transaction.toBytes(); // 调用Fireblocks API签名交易(需配置你的Fireblocks API密钥) const fireblocksResponse = await axios.post("https://api.fireblocks.io/v1/transactions", { assetId: "HEDERA_TESTNET", operation: "RAW", note: "Hedera转账交易签名", rawMessageData: { messages: [ { content: Buffer.from(transactionBytes).toString("base64") } ] }, source: { type: "VAULT_ACCOUNT", id: "你的Fireblocks金库ID" } }, { headers: { "X-API-Key": "你的Fireblocks API密钥", "Authorization": "Bearer 你的Fireblocks签名" } }); // 将Fireblocks返回的签名附加到交易 const signature = fireblocksResponse.data.signedMessages[0].signature.fullSig; transaction.addSignature(operatorId, Buffer.from(signature, "base64")); // 提交交易并获取回执 const response = await transaction.execute(client); const receipt = await response.getReceipt(client); console.log("交易状态:", receipt.status.toString()); } sendTransactionViaFireblocks().catch(console.error);
总结
- 直接用RSA密钥初始化Hedera客户端的方法不正确,Hedera不支持RSA作为操作密钥。
- 优先选择生成Hedera兼容的ED25519/ECDSA密钥,这是最简便的方案。
- 若必须使用RSA,需通过Fireblocks API完成交易签名,而非本地解析RSA密钥。
内容的提问来源于stack exchange,提问作者user30219775
相关产品推荐
相关产品推荐

