Skip to content

Commit 17cf418

Browse files
committed
extend settings
rework keygen to guess the keysize from extension
1 parent 3a67769 commit 17cf418

File tree

4 files changed

+28
-26
lines changed

4 files changed

+28
-26
lines changed

modules/setting/ssh.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ var SSH = struct {
6161
KeygenPath: "",
6262
MinimumKeySizeCheck: true,
6363
MinimumKeySizes: map[string]int{"ed25519": 256, "ed25519-sk": 256, "ecdsa": 256, "ecdsa-sk": 256, "rsa": 3071},
64-
ServerHostKeys: []string{"ssh/gitea.rsa", "ssh/gogs.rsa"},
64+
ServerHostKeys: []string{"ssh/gitea.rsa", "ssh/gitea.ed25519", "ssh/gitea.ecdsa", "ssh/gogs.rsa"},
6565
AuthorizedKeysCommandTemplate: "{{.AppPath}} --config={{.CustomConf}} serv key-{{.Key.ID}}",
6666
PerWriteTimeout: PerWriteTimeout,
6767
PerWritePerKbTimeout: PerWritePerKbTimeout,

modules/ssh/ssh.go

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -378,18 +378,19 @@ func Listen(host string, port int, ciphers, keyExchanges, macs []string) {
378378
}
379379

380380
if len(keys) == 0 {
381-
filePath := filepath.Dir(setting.SSH.ServerHostKeys[0])
382-
383-
if err := os.MkdirAll(filePath, os.ModePerm); err != nil {
384-
log.Error("Failed to create dir %s: %v", filePath, err)
385-
}
386-
387-
err := GenKeyPair(setting.SSH.ServerHostKeys[0], RSA)
388-
if err != nil {
389-
log.Fatal("Failed to generate private key: %v", err)
381+
for i := range 3 {
382+
filename := setting.SSH.ServerHostKeys[i]
383+
filePath := filepath.Dir(filename)
384+
if err := os.MkdirAll(filePath, os.ModePerm); err != nil {
385+
log.Error("Failed to create dir %s: %v", filePath, err)
386+
}
387+
err := GenKeyPair(filename)
388+
if err != nil {
389+
log.Fatal("Failed to generate private key: %v", err)
390+
}
391+
log.Trace("New private key is generated: %s", filename)
392+
keys = append(keys, filename)
390393
}
391-
log.Trace("New private key is generated: %s", setting.SSH.ServerHostKeys[0])
392-
keys = append(keys, setting.SSH.ServerHostKeys[0])
393394
}
394395

395396
for _, key := range keys {
@@ -409,8 +410,8 @@ func Listen(host string, port int, ciphers, keyExchanges, macs []string) {
409410
// GenKeyPair make a pair of public and private keys for SSH access.
410411
// Public key is encoded in the format for inclusion in an OpenSSH authorized_keys file.
411412
// Private Key generated is PEM encoded
412-
func GenKeyPair(keyPath string, keyType KeyType) error {
413-
privateKey, publicKey, err := keyGen(keyType)
413+
func GenKeyPair(keyPath string) error {
414+
privateKey, publicKey, err := keyGen(filepath.Ext(keyPath))
414415
if err != nil {
415416
return err
416417
}
@@ -455,18 +456,18 @@ func GenKeyPair(keyPath string, keyType KeyType) error {
455456
return err
456457
}
457458

458-
func keyGen(keytype KeyType) (any, any, error) {
459+
func keyGen(keytype string) (any, any, error) {
459460
switch keytype {
460-
case RSA:
461+
case ".rsa":
461462
privateKey, err := rsa.GenerateKey(rand.Reader, 4096)
462463
if err != nil {
463464
return nil, nil, err
464465
}
465466
return privateKey, &privateKey.PublicKey, nil
466-
case ED25519:
467+
case ".ed25519":
467468
pub, priv, err := ed25519.GenerateKey(rand.Reader)
468469
return priv, pub, err
469-
case ECDSA:
470+
case ".ecdsa":
470471
priv, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
471472
if err != nil {
472473
return nil, nil, err

modules/ssh/ssh_test.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"encoding/pem"
1212
"io"
1313
"os"
14+
"path/filepath"
1415
"testing"
1516

1617
"code.gitea.io/gitea/modules/ssh"
@@ -21,26 +22,26 @@ import (
2122

2223
func TestGenKeyPair(t *testing.T) {
2324
testCases := []struct {
24-
keyType ssh.KeyType
25+
keyPath string
2526
expectedType any
2627
}{
2728
{
28-
keyType: ssh.RSA,
29+
keyPath: "/gitea.rsa",
2930
expectedType: &rsa.PrivateKey{},
3031
},
3132
{
32-
keyType: ssh.ED25519,
33+
keyPath: "/gitea.ed25519",
3334
expectedType: ed25519.PrivateKey{},
3435
},
3536
{
36-
keyType: ssh.ECDSA,
37+
keyPath: "/gitea.ecdsa",
3738
expectedType: &ecdsa.PrivateKey{},
3839
},
3940
}
4041
for _, tC := range testCases {
41-
t.Run("Generate"+string(tC.keyType), func(t *testing.T) {
42-
path := t.TempDir() + "/gitea." + string(tC.keyType)
43-
require.NoError(t, ssh.GenKeyPair(path, tC.keyType))
42+
t.Run("Generate "+filepath.Ext(tC.keyPath), func(t *testing.T) {
43+
path := t.TempDir() + tC.keyPath
44+
require.NoError(t, ssh.GenKeyPair(path))
4445

4546
file, err := os.Open(path)
4647
require.NoError(t, err)

tests/integration/git_helper_for_declarative_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ func withKeyFile(t *testing.T, keyname string, callback func(string)) {
3232
assert.NoError(t, err)
3333

3434
keyFile := filepath.Join(tmpDir, keyname)
35-
err = ssh.GenKeyPair(keyFile, ssh.RSA)
35+
err = ssh.GenKeyPair(keyFile)
3636
assert.NoError(t, err)
3737

3838
err = os.WriteFile(path.Join(tmpDir, "ssh"), []byte("#!/bin/bash\n"+

0 commit comments

Comments
 (0)