mirror of https://github.com/grafana/grafana
Alerting: Add options to configure TLS for HA using Redis (#87567)
* Add Alerting HA Redis Client TLS configs * Add test to ping miniredis with mTLS * Update .ini files and docs * Add tests for unified alerting ha redis TLS settings * Fix malformed go.sum * Add modowner * Fix lint error * Update docs and use dstls configpull/83024/head^2
parent
e39658097f
commit
7a2fbad0c8
@ -0,0 +1,89 @@ |
||||
package notifier |
||||
|
||||
import ( |
||||
"context" |
||||
"crypto/tls" |
||||
"crypto/x509" |
||||
"os" |
||||
"testing" |
||||
"time" |
||||
|
||||
"github.com/alicebob/miniredis/v2" |
||||
dstls "github.com/grafana/dskit/crypto/tls" |
||||
"github.com/grafana/grafana/pkg/infra/log" |
||||
"github.com/madflojo/testcerts" |
||||
"github.com/prometheus/client_golang/prometheus" |
||||
"github.com/stretchr/testify/require" |
||||
) |
||||
|
||||
func TestNewRedisPeerWithTLS(t *testing.T) { |
||||
// Write client and server certificates/keys to tempDir, both issues by the same CA
|
||||
certPaths := createX509TestDir(t) |
||||
|
||||
// Set up tls.Config and start miniredis with server-side TLS
|
||||
x509Cert, err := tls.LoadX509KeyPair(certPaths.serverCert, certPaths.serverKey) |
||||
require.NoError(t, err) |
||||
clientCAPool := x509.NewCertPool() |
||||
clientCAFile, err := os.ReadFile(certPaths.ca) |
||||
require.NoError(t, err) |
||||
clientCAPool.AppendCertsFromPEM(clientCAFile) |
||||
|
||||
mr, err := miniredis.RunTLS(&tls.Config{ |
||||
Certificates: []tls.Certificate{x509Cert}, |
||||
ClientCAs: clientCAPool, |
||||
}) |
||||
require.NoError(t, err) |
||||
defer mr.Close() |
||||
|
||||
// Create redis peer with client-side TLS
|
||||
redisPeer, err := newRedisPeer(redisConfig{ |
||||
addr: mr.Addr(), |
||||
tlsEnabled: true, |
||||
tls: dstls.ClientConfig{ |
||||
CertPath: certPaths.clientCert, |
||||
KeyPath: certPaths.clientKey, |
||||
CAPath: certPaths.ca, |
||||
ServerName: "localhost", |
||||
}}, log.NewNopLogger(), prometheus.DefaultRegisterer, time.Second*60) |
||||
require.NoError(t, err) |
||||
|
||||
ping := redisPeer.redis.Ping(context.Background()) |
||||
require.NoError(t, ping.Err()) |
||||
} |
||||
|
||||
type certPaths struct { |
||||
clientCert string |
||||
clientKey string |
||||
serverCert string |
||||
serverKey string |
||||
ca string |
||||
} |
||||
|
||||
func createX509TestDir(t *testing.T) certPaths { |
||||
t.Helper() |
||||
|
||||
tmpDir := t.TempDir() |
||||
|
||||
ca := testcerts.NewCA() |
||||
caCertFile, _, err := ca.ToTempFile(tmpDir) |
||||
require.NoError(t, err) |
||||
|
||||
serverKp, err := ca.NewKeyPair("localhost") |
||||
require.NoError(t, err) |
||||
|
||||
serverCertFile, serverKeyFile, err := serverKp.ToTempFile(tmpDir) |
||||
require.NoError(t, err) |
||||
|
||||
clientKp, err := ca.NewKeyPair() |
||||
require.NoError(t, err) |
||||
clientCertFile, clientKeyFile, err := clientKp.ToTempFile(tmpDir) |
||||
require.NoError(t, err) |
||||
|
||||
return certPaths{ |
||||
clientCert: clientCertFile.Name(), |
||||
clientKey: clientKeyFile.Name(), |
||||
serverCert: serverCertFile.Name(), |
||||
serverKey: serverKeyFile.Name(), |
||||
ca: caCertFile.Name(), |
||||
} |
||||
} |
Loading…
Reference in new issue