1

我有以下代码,利用 Cisco 的node-jose库:

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

async function initialize() {
  // 1
  const keystore = jose.JWK.createKeyStore();

  // 2
  const props = {
    use: 'sig',
    alg: 'RS256',
  };
  const publicKey = await keystore.generate("RSA", 2048, props);
  console.log(publicKey);

  // 3
  const payload = Buffer.from(JSON.stringify({
    "sub": "1234567890",
    "name": "Nick",
    "role": "role",
    "iat": 1516239022
  }));
  const signOpts = {
    format: 'compact'
  };

  const token = await jose.JWS.createSign({
      alg: 'RS256',
      format: 'flattened',
    }, publicKey)
    .update(payload)
    .final();

  console.log(token);
}

initialize();

快速解释我如何相信上述内容:

  1. 创建密钥库,
  2. 创建密钥,
  3. 签署钥匙。

但是,我在第 2 步得到的输出如下:

JWKBaseKeyObject {
  keystore: JWKStore {},
  length: 2048,
  kty: 'RSA',
  kid: 'pbYnpbZf5l6u5TohyLN4Ofs0BB8xvSDYUjI3Z_ITenI',
  use: 'sig',
  alg: 'RS256'
}

在第 3 步,它输出以下内容:

{
  payload: 'eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6Ik5pY2siLCJyb2xlIjoicm9sZSIsImlhdCI6MTUxNjIzOTAyMn0',
  signatures: [
    {
      protected: 'eyJhbGciOiJSUzI1NiIsImtpZCI6Ik9OVGNvSXlaYjEwLUhOdmFnNnIxa1lVS282WVlielJqNDM4V182WXZJam8ifQ',
      signature: 'vwUT7iohRYFSde5WQin-86yKjgu5BCVdoKXydNR-X5vsWebk5IUoPvufb6ZJdWcK2zipVGtmOFJhKoslpUfZo4qNqYYMKEfzNwaiFNbUmoF8oCGfMtXIbjhKVnlQIKZCErGTbuB2EF63ifscJtvzmpRKfoPqeR10dOGkX0ME7x0rhior4b9p2p8ZU5ZUuvwlUe3u-iac5HDMC4gMTmUm13Rgbu05f25teZsqBSkCItoJAaeIrhZGQKvi-UeeuK8E1DIvhxOf_7She-E4lo_Umzyxm9JOptaFI6C8foTUGlyHVj0dyLbDE3-JhOe7P75Xgrfembg8JD2E5IHrRnlNdg'
    }
  ]
}

老实说,在这一点上我很迷茫。我所期待的是类似于此示例 JWKS作为最终输出的内容,但我并不真正了解如何使用第 3 步的输出来获得与示例类似的内容。

谁能解释我应该怎么做才能最终获得x5candx5t属性?


万一上面是一个 XY 问题,我想做的是从头开始创建一个 JWKS 文件,这样我就可以使用jwksUri,如jwks-rsa包的示例所示。理想情况下,我想使用node-jose或其他可以在未来扩展的证书以在 Node.js 中进行编程密钥轮换

4

0 回答 0