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

使用Node-Jose将JWT转JWE时出错(React/Express环境)

问题原因分析

你的代码存在两个核心错误,直接导致了生成JWE失败:

  • 生成JWT(JWS签名)时误用了RSA公钥,签名操作必须使用私钥,公钥仅能用于验证签名有效性,无法完成签名。
  • 密钥用途与操作不匹配,Node-Jose会严格校验密钥的使用场景,用公钥签名会触发"无效密钥用途"类的错误。
修正后的代码示例

请确保你持有正确的RSA密钥对:私钥用于签名JWT,公钥用于加密生成JWE。

const jose = require('node-jose');

// 替换为你的RSA私钥(用于签名JWT)
const rsaPrivateKey = `-----BEGIN RSA PRIVATE KEY-----
你的私钥内容
-----END RSA PRIVATE KEY-----`;

// 替换为你的RSA公钥(用于加密生成JWE)
const rsaPublicKey = `-----BEGIN PUBLIC KEY-----
你的公钥内容
-----END PUBLIC KEY-----`;

const createJWE = async () => {
    const payload = {
        idToken: 'token',
    };

    try {
        // 使用RSA私钥签名生成JWT(JWS)
        const jwt = await jose.JWS.createSign({ format: 'compact' }, { key: rsaPrivateKey })
            .update(JSON.stringify(payload))
            .final();

        // 使用RSA公钥加密JWT生成JWE
        const jwe = await jose.JWE.createEncrypt({ format: 'compact' }, { key: rsaPublicKey })
            .update(jwt)
            .final();
        
        console.log('生成的JWE:', jwe);
    } catch (error) {
        console.error('JWE创建错误:', error);
    }
};

createJWE();
额外注意事项
  • 密钥格式必须合规:Node-JOSE仅支持PEM格式密钥,需确保私钥、公钥的首尾标记完整。
  • 前端React环境禁止暴露私钥:签名操作必须放在Express后端完成,前端仅可处理加密逻辑(且不能持有私钥)。
  • 可显式指定密钥用途避免歧义:通过jose.JWK.asKey()明确标记密钥用于签名或加密,示例如下:
    const privateKey = await jose.JWK.asKey(rsaPrivateKey, 'pem', { use: 'sig' });
    const publicKey = await jose.JWK.asKey(rsaPublicKey, 'pem', { use: 'enc' });
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:08:12