@@ -19,19 +19,37 @@ import (
1919
2020var (
2121 DevSpaceSSHFolder = "ssh"
22+ DevSpaceSSHHostKeyFile = "id_devspace_host_rsa"
2223 DevSpaceSSHPrivateKeyFile = "id_devspace_rsa"
2324 DevSpaceSSHPublicKeyFile = "id_devspace_rsa.pub"
2425)
2526
2627func init () {
2728 homeDir , _ := homedir .Dir ()
2829 DevSpaceSSHFolder = filepath .Join (homeDir , constants .DefaultHomeDevSpaceFolder , DevSpaceSSHFolder )
30+ DevSpaceSSHHostKeyFile = filepath .Join (DevSpaceSSHFolder , DevSpaceSSHHostKeyFile )
2931 DevSpaceSSHPrivateKeyFile = filepath .Join (DevSpaceSSHFolder , DevSpaceSSHPrivateKeyFile )
3032 DevSpaceSSHPublicKeyFile = filepath .Join (DevSpaceSSHFolder , DevSpaceSSHPublicKeyFile )
3133}
3234
3335var keyLock sync.Mutex
3436
37+ func MakeHostKey () (string , error ) {
38+ privateKey , err := rsa .GenerateKey (rand .Reader , 2048 )
39+ if err != nil {
40+ return "" , err
41+ }
42+
43+ // generate and write private key as PEM
44+ var privKeyBuf strings.Builder
45+ privateKeyPEM := & pem.Block {Type : "RSA PRIVATE KEY" , Bytes : x509 .MarshalPKCS1PrivateKey (privateKey )}
46+ if err := pem .Encode (& privKeyBuf , privateKeyPEM ); err != nil {
47+ return "" , err
48+ }
49+
50+ return privKeyBuf .String (), nil
51+ }
52+
3553func MakeSSHKeyPair () (string , string , error ) {
3654 privateKey , err := rsa .GenerateKey (rand .Reader , 2048 )
3755 if err != nil {
@@ -56,6 +74,41 @@ func MakeSSHKeyPair() (string, string, error) {
5674 return pubKeyBuf .String (), privKeyBuf .String (), nil
5775}
5876
77+ func getHostKey () (string , error ) {
78+ keyLock .Lock ()
79+ defer keyLock .Unlock ()
80+
81+ _ , err := os .Stat (DevSpaceSSHFolder )
82+ if err != nil {
83+ err = os .MkdirAll (DevSpaceSSHFolder , 0755 )
84+ if err != nil {
85+ return "" , err
86+ }
87+ }
88+
89+ // check if key pair exists
90+ _ , err = os .Stat (DevSpaceSSHHostKeyFile )
91+ if err != nil {
92+ privateKey , err := MakeHostKey ()
93+ if err != nil {
94+ return "" , errors .Wrap (err , "generate host key" )
95+ }
96+
97+ err = ioutil .WriteFile (DevSpaceSSHHostKeyFile , []byte (privateKey ), 0600 )
98+ if err != nil {
99+ return "" , errors .Wrap (err , "write host key" )
100+ }
101+ }
102+
103+ // read public key
104+ out , err := ioutil .ReadFile (DevSpaceSSHHostKeyFile )
105+ if err != nil {
106+ return "" , errors .Wrap (err , "read host ssh key" )
107+ }
108+
109+ return base64 .StdEncoding .EncodeToString (out ), nil
110+ }
111+
59112func getPublicKey () (string , error ) {
60113 keyLock .Lock ()
61114 defer keyLock .Unlock ()
0 commit comments