Skip to content

Commit adaf8f1

Browse files
committed
initial changes to make cert <-> broker comms work
1 parent d3b84f7 commit adaf8f1

File tree

4 files changed

+96
-2
lines changed

4 files changed

+96
-2
lines changed

main.go

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,9 @@ func initialize() { // Client Mode Prereq Check
120120
}
121121
}
122122

123-
genCerts()
123+
if err = genCerts(); err != nil {
124+
logger.Log(0, "something went wrong when generating broker certs", err.Error())
125+
}
124126

125127
if servercfg.IsMessageQueueBackend() {
126128
if err = mq.ServerStartNotify(); err != nil {
@@ -251,5 +253,40 @@ func genCerts() error {
251253
} else if err != nil {
252254
return err
253255
}
256+
257+
_, scErr := serverctl.ReadClientCertFromDB()
258+
serverClientCert, err := serverctl.ReadCertFromDB(tls.SERVER_CLIENT_PEM)
259+
if errors.Is(err, os.ErrNotExist) || database.IsEmptyRecord(err) || database.IsEmptyRecord(scErr) || serverClientCert.NotAfter.Before(time.Now().Add(time.Hour*24*10)) {
260+
//gen new key
261+
logger.Log(0, "generating new server client key/certificate")
262+
_, key, err := ed25519.GenerateKey(rand.Reader)
263+
if err != nil {
264+
return err
265+
}
266+
serverName := tls.NewCName(servercfg.GetServer())
267+
csr, err := tls.NewCSR(key, serverName)
268+
if err != nil {
269+
return err
270+
}
271+
serverClientCert, err := tls.NewEndEntityCert(*private, csr, ca, tls.CERTIFICATE_VALIDITY)
272+
if err != nil {
273+
return err
274+
}
275+
276+
if err := serverctl.SaveKey(functions.GetNetmakerPath()+ncutils.GetSeparator(), tls.SERVER_CLIENT_KEY, key); err != nil {
277+
return err
278+
}
279+
if err := serverctl.SaveCert(functions.GetNetmakerPath()+ncutils.GetSeparator(), tls.SERVER_CLIENT_PEM, serverClientCert); err != nil {
280+
return err
281+
}
282+
return serverctl.SaveClientCertToDB(
283+
functions.GetNetmakerPath()+ncutils.GetSeparator()+tls.SERVER_CLIENT_PEM,
284+
functions.GetNetmakerPath()+ncutils.GetSeparator()+tls.SERVER_CLIENT_KEY,
285+
ca,
286+
)
287+
} else if err != nil {
288+
return err
289+
}
290+
254291
return nil
255292
}

mq/mq.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/gravitl/netmaker/logger"
1010
"github.com/gravitl/netmaker/netclient/ncutils"
1111
"github.com/gravitl/netmaker/servercfg"
12+
"github.com/gravitl/netmaker/serverctl"
1213
)
1314

1415
// KEEPALIVE_TIMEOUT - time in seconds for timeout
@@ -27,6 +28,11 @@ func SetupMQTT(publish bool) mqtt.Client {
2728
opts.AddBroker(servercfg.GetMessageQueueEndpoint())
2829
id := ncutils.MakeRandomString(23)
2930
opts.ClientID = id
31+
tlsConfig, err := serverctl.ReadClientCertFromDB()
32+
if err != nil {
33+
logger.Log(0, "failed to get TLS config for server to broker connection", err.Error())
34+
}
35+
opts.SetTLSConfig(tlsConfig)
3036
opts.SetAutoReconnect(true)
3137
opts.SetConnectRetry(true)
3238
opts.SetConnectRetryInterval(time.Second << 2)
@@ -68,6 +74,9 @@ func SetupMQTT(publish bool) mqtt.Client {
6874
}
6975
time.Sleep(2 * time.Second)
7076
}
77+
if !publish {
78+
logger.Log(0, "successfully connected to mq broker")
79+
}
7180
return client
7281
}
7382

serverctl/tls.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package serverctl
22

33
import (
44
"crypto/ed25519"
5+
ssl "crypto/tls"
56
"crypto/x509"
67
"encoding/json"
78
"encoding/pem"
@@ -103,3 +104,42 @@ func ReadKeyFromDB(name string) (*ed25519.PrivateKey, error) {
103104
private := key.(ed25519.PrivateKey)
104105
return &private, nil
105106
}
107+
108+
// SaveClientCertToDB - saves client cert for servers to connect to MQ broker with
109+
func SaveClientCertToDB(serverClientPemPath, serverClientKeyPath string, ca *x509.Certificate) error {
110+
certpool := x509.NewCertPool()
111+
ok := certpool.AppendCertsFromPEM(ca.Raw)
112+
if !ok {
113+
return fmt.Errorf("failed to append root cert to server client cert")
114+
}
115+
clientKeyPair, err := ssl.LoadX509KeyPair(serverClientPemPath, serverClientKeyPath)
116+
if err != nil {
117+
return err
118+
}
119+
certs := []ssl.Certificate{clientKeyPair}
120+
netmakerClientCert := ssl.Config{
121+
RootCAs: certpool,
122+
ClientAuth: ssl.NoClientCert,
123+
ClientCAs: nil,
124+
Certificates: certs,
125+
InsecureSkipVerify: false,
126+
}
127+
data, err := json.Marshal(netmakerClientCert)
128+
if err != nil {
129+
return err
130+
}
131+
return database.Insert(tls.SERVER_CLIENT_ENTRY, string(data), database.CERTS_TABLE_NAME)
132+
}
133+
134+
// ReadClientCertFromDB - reads the client cert from the DB
135+
func ReadClientCertFromDB() (*ssl.Config, error) {
136+
var netmakerClientCert ssl.Config
137+
record, err := database.FetchRecord(database.CERTS_TABLE_NAME, tls.SERVER_CLIENT_ENTRY)
138+
if err != nil {
139+
return nil, err
140+
}
141+
if err = json.Unmarshal([]byte(record), &netmakerClientCert); err != nil {
142+
return nil, err
143+
}
144+
return &netmakerClientCert, err
145+
}

tls/tls.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import (
1818
)
1919

2020
const (
21-
2221
// CERTTIFICATE_VALIDITY duration of certificate validity in days
2322
CERTIFICATE_VALIDITY = 365
2423

@@ -33,6 +32,15 @@ const (
3332

3433
// ROOT_PEM_NAME - name of root pem
3534
ROOT_PEM_NAME = "root.pem"
35+
36+
// SERVER_CLIENT_PEM - the name of server client cert
37+
SERVER_CLIENT_PEM = "serverclient.pem"
38+
39+
// SERVER_CLIENT_KEY - the name of server client key
40+
SERVER_CLIENT_KEY = "serverclient.key"
41+
42+
// SERVER_CLIENT_ENTRY - the server client cert key for DB
43+
SERVER_CLIENT_ENTRY = "servercliententry"
3644
)
3745

3846
type (

0 commit comments

Comments
 (0)