From 126f8003469f75c5caf1708804ea30d5943ff6fd Mon Sep 17 00:00:00 2001 From: Levi Yan Date: Mon, 28 Oct 2024 14:58:10 +0800 Subject: [PATCH] feat: create user's ssh key --- package.json | 3 ++- src/home.ts | 2 +- src/user.ts | 15 ++++++++++----- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index eb9ecf8..2b97dee 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,8 @@ }, "dependencies": { "fs-plus": "~3.1.1", - "node-ssh": "^13.2.0" + "node-ssh": "^13.2.0", + "sshpk": "^1.18.0" }, "devDependencies": { "@babel/core": "~7.21.3", diff --git a/src/home.ts b/src/home.ts index eefa77b..eccc0bf 100644 --- a/src/home.ts +++ b/src/home.ts @@ -96,7 +96,7 @@ export default class DSHome { break; } case 'createUserPublicKey': - this.user.createUserSSHKey(); + await this.user.createUserSSHKey(); if (this.user.existUserPublicKey()) { panel.webview.postMessage({command: 'createUserPublicKey', data: {ok: true}}) break; diff --git a/src/user.ts b/src/user.ts index 4176e7e..905b1c9 100644 --- a/src/user.ts +++ b/src/user.ts @@ -4,7 +4,9 @@ import * as os from 'os'; import * as fs from 'fs'; const { generateKeyPairSync, -} = require('node:crypto') + createHash +} = require('node:crypto'); +const sshpk = require('sshpk'); export default class User { private context:vscode.ExtensionContext; @@ -93,7 +95,7 @@ export default class User { return fs.readFileSync(userPrivateKey, 'utf-8'); } - public createUserSSHKey() { + public async createUserSSHKey() { if (this.existUserPublicKey() && this.existUserPrivateKey()) { // if both public and private key exists, stop return; @@ -102,7 +104,7 @@ export default class User { const { publicKey, privateKey, - } = generateKeyPairSync('rsa', { + } = await generateKeyPairSync('rsa', { modulusLength: 4096, publicKeyEncoding: { type: 'spki', @@ -115,10 +117,13 @@ export default class User { passphrase: 'devstar' }, }); + const publicKeyFingerprint = sshpk.parseKey(publicKey, 'pem').toString('ssh'); + const publicKeyStr = publicKeyFingerprint; // public key is public key fingerprint + const privateKeyStr = privateKey; try { - fs.writeFileSync(this.getUserPublicKeyPath(), publicKey); - fs.writeFileSync(this.getUserPrivateKeyPath(), privateKey); + fs.writeFileSync(this.getUserPublicKeyPath(), publicKeyStr); + fs.writeFileSync(this.getUserPrivateKeyPath(), privateKeyStr); } catch(error) { console.error("Failed to write public/private key into the default ssh public/key file: ", error); }