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

ES256KSigner构造报错:私钥长度不匹配问题排查与解决

解决ES256KSigner构造失败:Invalid private key format问题

问题重现

在构建JWT格式可验证凭证签名器时,使用ES256KSigner构造签名器失败,报错:

Error: bad_key: Invalid private key format. Expecting 32 bytes, but got 43

错误出现在直接使用@decentralized-identity/ion-tools生成的JWK中的d字段作为参数传入ES256KSigner时。

示例代码

import { anchor, DID, generateKeyPair } from '@decentralized-identity/ion-tools';
import { ES256KSigner, hexToBytes } from 'did-jwt';

let authKeys = await generateKeyPair();
console.log("generate key: ", authKeys)
// 直接使用privateJwk的d字段构造签名器
let signer = ES256KSigner(authKeys.privateJwk.d)

运行输出

generate key:  {
  publicJwk: {
    kty: 'EC',
    crv: 'secp256k1',
    x: 'AgykbSMim_qMMlo0Lh2DucKZ3XwpvGh6qv4BXQo1lxE',
    y: 'X_7mp4aTLjYQuxdSgEpb-3RtCgLeevp6FG34HwC5XjQ'
  },
  privateJwk: {
    kty: 'EC',
    crv: 'secp256k1',
    x: 'AgykbSMim_qMMlo0Lh2DucKZ3XwpvGh6qv4BXQo1lxE',
    y: 'X_7mp4aTLjYQuxdSgEpb-3RtCgLeevp6FG34HwC5XjQ',
    d: 'tcGhsoByPlNppNLQxr_hFNAR7lGhB1JW_SFo4rxTZpo'
  }
}
file:///work/did/did_demo/node_modules/did-jwt/lib/index.module.js:184
    throw new Error(`bad_key: Invalid private key format. Expecting 32 bytes, but got ${privateKeyBytes.length}`);
          ^

Error: bad_key: Invalid private key format. Expecting 32 bytes, but got 43
    at ES256KSigner (file:///work/did/did_demo/node_modules/did-jwt/lib/index.module.js:184:11)
    at file:///work/did/did_demo/issuer.js:13:16

使用版本

{
  "@decentralized-identity/ion-tools": "^1.0.7",
  "did-jwt": "^7.2.2",
  "did-jwt-vc": "^3.2.3",
  "elliptic": "^6.5.4",
  "express": "^4.18.2"
}

错误原因

JWK(JSON Web Key)中的d字段是Base64URL编码的32字节私钥,而ES256KSigner要求传入的是原始的二进制私钥(Uint8Array类型)。直接传入字符串的话,会被当作UTF-8编码的字节处理,导致字节长度不符合32字节的要求(例子中得到43字节),从而触发错误。

解决方法

使用Base64URL解码工具将d字段解码为二进制数据后,再传入ES256KSigner:

import { base64url } from 'multiformats/bases/base64';
import { anchor, DID, generateKeyPair } from '@decentralized-identity/ion-tools';
import { ES256KSigner } from 'did-jwt';

let authKeys = await generateKeyPair();
// 解码Base64URL格式的d字段得到二进制私钥
let privateKey = base64url.baseDecode(authKeys.privateJwk.d);
let signer = ES256KSigner(privateKey);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 04:30:32