Open3
nest: `node-jose` で鍵ペアを生成する
node.jsで動くJOSE実装には jose
や node-jose
がある。
今回はRFC以上の機能を持っていないという理由で node-jose
を選んだけど、通常のシチュエーションでは jose
で良いと思う。
鍵の生成
import jose from "node-jose";
import fs from "fs";
const keystore = jose.JWK.createKeyStore();
async function run(){
await keystore.generate("EC", "P-256");
await keystore.generate("RSA", 3072);
fs.writeFileSync("./keys.json", JSON.stringify(keystore.toJSON(true)));
}
run();
... 特にコメントは無いな。。 Key storeオブジェクトを作って generate する。
鍵ペアの場合、秘密鍵をエクスポートするには toJSON
に true
を渡す必要がある。
鍵の出力
前回書いたデバイスキーは、JSON形式の鍵(JWK)を含んだオブジェクトをbase64urlエンコードしたものになっている。というわけでエンコードする。
import jose from "node-jose";
import fs from "fs";
async function run(){
const ks = JSON.parse(fs.readFileSync("./keys.json"));
const cfg = JSON.parse(fs.readFileSync("./config.json"));
const keystore = await jose.JWK.asKeyStore(ks);
const eckey = keystore.all({kty: "EC"})[0];
let devicekey = {};
devicekey.u = cfg.deviceuri;
devicekey.k = eckey.toJSON(); // Public key only
console.log("Devicekey", jose.util.base64url.encode(JSON.stringify(devicekey)));
}
run();
(config.json
にはデバイスのURLが含まれている)
ユーザーに渡すキーには公開鍵のみがあれば十分なので、 toJSON
には空を渡す。