@@ -2,6 +2,8 @@ package nsqd
2
2
3
3
import (
4
4
"bytes"
5
+ "crypto/rand"
6
+ "encoding/base64"
5
7
"encoding/json"
6
8
"net"
7
9
"os"
@@ -62,7 +64,8 @@ func initSerf(opts *Options,
62
64
tcpAddr * net.TCPAddr ,
63
65
httpAddr * net.TCPAddr ,
64
66
httpsAddr * net.TCPAddr ,
65
- broadcastAddr * net.TCPAddr ) (* serf.Serf , error ) {
67
+ broadcastAddr * net.TCPAddr ,
68
+ key []byte ) (* serf.Serf , error ) {
66
69
67
70
hostname , err := os .Hostname ()
68
71
if err != nil {
@@ -93,6 +96,9 @@ func initSerf(opts *Options,
93
96
serfConfig .MemberlistConfig .GossipInterval = 100 * time .Millisecond
94
97
serfConfig .MemberlistConfig .GossipNodes = 5
95
98
serfConfig .MemberlistConfig .LogOutput = logWriter {opts .Logger , []byte ("memberlist:" )}
99
+ if len (key ) != 0 {
100
+ serfConfig .MemberlistConfig .SecretKey = key
101
+ }
96
102
serfConfig .EventCh = serfEventChan
97
103
serfConfig .EventBuffer = 1024
98
104
serfConfig .ReconnectTimeout = time .Hour
@@ -286,6 +292,13 @@ func (n *NSQD) gossipLoop() {
286
292
var topicName string
287
293
var channelName string
288
294
295
+ if n .serf .EncryptionEnabled () {
296
+ err := n .rotateGossipKey ()
297
+ n .logf ("FATAL: could not rotate gossip key - %s" , err )
298
+ n .Exit ()
299
+ return
300
+ }
301
+
289
302
regossipTicker := time .NewTicker (n .getOpts ().GossipRegossipInterval )
290
303
291
304
if len (n .getOpts ().GossipSeedAddresses ) > 0 {
@@ -363,3 +376,34 @@ exit:
363
376
regossipTicker .Stop ()
364
377
n .logf ("GOSSIP: exiting" )
365
378
}
379
+
380
+ func (n * NSQD ) initialGossipKey () []byte {
381
+ var key []byte
382
+ if n .tlsConfig != nil && len (n .tlsConfig .Certificates ) > 0 {
383
+ key = n .tlsConfig .Certificates [0 ].Leaf .Signature
384
+ }
385
+ if n .gossipKey == nil {
386
+ n .gossipKey = key
387
+ }
388
+ return key
389
+ }
390
+
391
+ func (n * NSQD ) rotateGossipKey () error {
392
+ if n .gossipKey == nil {
393
+ return nil
394
+ }
395
+
396
+ key := make ([]byte , 32 )
397
+ _ , err := rand .Reader .Read (key )
398
+ strKey := base64 .StdEncoding .EncodeToString (key )
399
+ _ , err = n .serf .KeyManager ().InstallKey (strKey )
400
+ if err != nil {
401
+ return err
402
+ }
403
+ _ , err = n .serf .KeyManager ().UseKey (strKey )
404
+ if err != nil {
405
+ return err
406
+ }
407
+ _ , err = n .serf .KeyManager ().RemoveKey (string (n .gossipKey ))
408
+ return err
409
+ }
0 commit comments