Browse Source

Use ssh-keygen to convert ssh keys (#2197)

* use ssh-keygen to convert keys

* drop incorrect typings

* .

* Update ssh.service.ts

* Update ssh.service.ts

* Update ssh.service.ts
Eugene 5 years ago
parent
commit
f5ffdc1707

BIN
extras/ssh-keygen/libcrypto.dll


BIN
extras/ssh-keygen/ssh-keygen.exe


+ 1 - 0
terminus-ssh/package.json

@@ -24,6 +24,7 @@
     "ssh2": "^0.8.2",
     "ssh2": "^0.8.2",
     "ssh2-streams": "^0.4.2",
     "ssh2-streams": "^0.4.2",
     "sshpk": "^1.16.1",
     "sshpk": "^1.16.1",
+    "temp": "^0.9.1",
     "terminus-terminal": "^1.0.98-nightly.0"
     "terminus-terminal": "^1.0.98-nightly.0"
   },
   },
   "peerDependencies": {
   "peerDependencies": {

+ 0 - 1
terminus-ssh/src/components/sshTab.component.pug

@@ -11,5 +11,4 @@
             span Ports
             span Ports
 
 
         button.btn.btn-info((click)='reconnect()', *ngIf='!session.open')
         button.btn.btn-info((click)='reconnect()', *ngIf='!session.open')
-            i.fas.fa-reload
             span Reconnect
             span Reconnect

+ 27 - 2
terminus-ssh/src/services/ssh.service.ts

@@ -1,12 +1,14 @@
 import colors from 'ansi-colors'
 import colors from 'ansi-colors'
+import { open as openTemp } from 'temp'
 import { Injectable, NgZone } from '@angular/core'
 import { Injectable, NgZone } from '@angular/core'
 import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
 import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
 import { Client } from 'ssh2'
 import { Client } from 'ssh2'
 import * as fs from 'mz/fs'
 import * as fs from 'mz/fs'
+import { execFile } from 'mz/child_process'
 import * as path from 'path'
 import * as path from 'path'
 import * as sshpk from 'sshpk'
 import * as sshpk from 'sshpk'
 import { ToastrService } from 'ngx-toastr'
 import { ToastrService } from 'ngx-toastr'
-import { AppService, HostAppService, Platform, Logger, LogService } from 'terminus-core'
+import { AppService, HostAppService, Platform, Logger, LogService, ElectronService } from 'terminus-core'
 import { SSHConnection, SSHSession } from '../api'
 import { SSHConnection, SSHSession } from '../api'
 import { PromptModalComponent } from '../components/promptModal.component'
 import { PromptModalComponent } from '../components/promptModal.component'
 import { SSHTabComponent } from '../components/sshTab.component'
 import { SSHTabComponent } from '../components/sshTab.component'
@@ -24,6 +26,7 @@ export class SSHService {
     private constructor (
     private constructor (
         private log: LogService,
         private log: LogService,
         private app: AppService,
         private app: AppService,
+        private electron: ElectronService,
         private zone: NgZone,
         private zone: NgZone,
         private ngbModal: NgbModal,
         private ngbModal: NgbModal,
         private hostApp: HostAppService,
         private hostApp: HostAppService,
@@ -105,7 +108,29 @@ export class SSHService {
                     }
                     }
                 }
                 }
 
 
-                privateKey = parsedKey!.toString('pem')
+                const sshFormatKey = parsedKey!.toString('openssh')
+                const temp = await openTemp()
+                fs.close(temp.fd)
+                await fs.writeFile(temp.path, sshFormatKey)
+
+                let sshKeygenPath = 'ssh-keygen'
+                if (this.hostApp.platform === Platform.Windows) {
+                    sshKeygenPath = path.join(
+                        path.dirname(this.electron.app.getPath('exe')),
+                        'resources',
+                        'extras',
+                        'ssh-keygen',
+                        'ssh-keygen.exe',
+                    )
+                }
+
+                await execFile(sshKeygenPath, [
+                    '-p', '-P', '', '-N', '', '-m', 'PEM', '-f',
+                    temp.path,
+                ])
+
+                privateKey = await fs.readFile(temp.path, { encoding: 'utf-8' })
+                fs.unlink(temp.path)
             }
             }
         }
         }
 
 

+ 86 - 0
terminus-ssh/yarn.lock

@@ -44,6 +44,11 @@ assert-plus@^1.0.0:
   resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
   resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
   integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
   integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
 
 
+balanced-match@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+  integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
+
 bcrypt-pbkdf@^1.0.0, bcrypt-pbkdf@^1.0.2:
 bcrypt-pbkdf@^1.0.0, bcrypt-pbkdf@^1.0.2:
   version "1.0.2"
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
   resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
@@ -51,11 +56,24 @@ bcrypt-pbkdf@^1.0.0, bcrypt-pbkdf@^1.0.2:
   dependencies:
   dependencies:
     tweetnacl "^0.14.3"
     tweetnacl "^0.14.3"
 
 
+brace-expansion@^1.1.7:
+  version "1.1.11"
+  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+  integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+  dependencies:
+    balanced-match "^1.0.0"
+    concat-map "0.0.1"
+
 cli-spinner@^0.2.10:
 cli-spinner@^0.2.10:
   version "0.2.10"
   version "0.2.10"
   resolved "https://registry.yarnpkg.com/cli-spinner/-/cli-spinner-0.2.10.tgz#f7d617a36f5c47a7bc6353c697fc9338ff782a47"
   resolved "https://registry.yarnpkg.com/cli-spinner/-/cli-spinner-0.2.10.tgz#f7d617a36f5c47a7bc6353c697fc9338ff782a47"
   integrity sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q==
   integrity sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q==
 
 
[email protected]:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+  integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
 dashdash@^1.12.0:
 dashdash@^1.12.0:
   version "1.14.1"
   version "1.14.1"
   resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
   resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
@@ -71,6 +89,11 @@ ecc-jsbn@~0.1.1:
     jsbn "~0.1.0"
     jsbn "~0.1.0"
     safer-buffer "^2.1.0"
     safer-buffer "^2.1.0"
 
 
+fs.realpath@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+  integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
 getpass@^0.1.1:
 getpass@^0.1.1:
   version "0.1.7"
   version "0.1.7"
   resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
   resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
@@ -78,11 +101,62 @@ getpass@^0.1.1:
   dependencies:
   dependencies:
     assert-plus "^1.0.0"
     assert-plus "^1.0.0"
 
 
+glob@^7.1.3:
+  version "7.1.6"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
+  integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.4"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+inflight@^1.0.4:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+  integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+  dependencies:
+    once "^1.3.0"
+    wrappy "1"
+
+inherits@2:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+  integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
 jsbn@~0.1.0:
 jsbn@~0.1.0:
   version "0.1.1"
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
   resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
   integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
   integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
 
 
+minimatch@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+  integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+  dependencies:
+    brace-expansion "^1.1.7"
+
+once@^1.3.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+  integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+  dependencies:
+    wrappy "1"
+
+path-is-absolute@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+  integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+rimraf@~2.6.2:
+  version "2.6.3"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
+  integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
+  dependencies:
+    glob "^7.1.3"
+
 safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
 safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
   version "2.1.2"
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
   resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
@@ -124,6 +198,13 @@ streamsearch@~0.1.2:
   resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a"
   resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a"
   integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=
   integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=
 
 
+temp@^0.9.1:
+  version "0.9.1"
+  resolved "https://registry.yarnpkg.com/temp/-/temp-0.9.1.tgz#2d666114fafa26966cd4065996d7ceedd4dd4697"
+  integrity sha512-WMuOgiua1xb5R56lE0eH6ivpVmg/lq2OHm4+LtT/xtEtPQ+sz6N3bBM6WZ5FvO1lO4IKIOb43qnhoc4qxP5OeA==
+  dependencies:
+    rimraf "~2.6.2"
+
 terminus-terminal@^1.0.98-nightly.0:
 terminus-terminal@^1.0.98-nightly.0:
   version "1.0.98-nightly.0"
   version "1.0.98-nightly.0"
   resolved "https://registry.yarnpkg.com/terminus-terminal/-/terminus-terminal-1.0.98-nightly.0.tgz#10df71b0a81adf76a076fb21a91c859dd2f8bef7"
   resolved "https://registry.yarnpkg.com/terminus-terminal/-/terminus-terminal-1.0.98-nightly.0.tgz#10df71b0a81adf76a076fb21a91c859dd2f8bef7"
@@ -133,3 +214,8 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0:
   version "0.14.5"
   version "0.14.5"
   resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
   resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
   integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
   integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
+
+wrappy@1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+  integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=