我有以下代码,利用 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();
快速解释我如何相信上述内容:
- 创建密钥库,
- 创建密钥,
- 签署钥匙。
但是,我在第 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 步的输出来获得与示例类似的内容。
谁能解释我应该怎么做才能最终获得x5c
andx5t
属性?
万一上面是一个 XY 问题,我想做的是从头开始创建一个 JWKS 文件,这样我就可以使用jwksUri
,如jwks-rsa
包的示例所示。理想情况下,我想使用node-jose
或其他可以在未来扩展的证书以在 Node.js 中进行编程密钥轮换