Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[xserver] TLS support added to xserver, aggregator server, and aggregator client #4266

Open
wants to merge 51 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 7 commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
f252408
Add support of TLS to xserver
roman-mazhut Apr 18, 2024
413d9d3
Add support of TLS to aggregator tcp client
roman-mazhut Apr 18, 2024
a57d5a6
Add TLS configuration to aggregator server config
roman-mazhut Apr 18, 2024
3a206dc
Split xserver options into options and TLS options
roman-mazhut Apr 18, 2024
f32c307
Description added to the IsTLS function
roman-mazhut Apr 23, 2024
92e0920
Pointers replaced with values in client TLS configuration
roman-mazhut Apr 23, 2024
4c798f8
Close a connection before returning an error if an upgrade to TLS failed
roman-mazhut Apr 23, 2024
8c4513a
TLSEnabled renamed to Enabled
roman-mazhut Apr 26, 2024
446d2ef
Integration tests
roman-mazhut May 22, 2024
d992b6f
Cert pool moved to the client struct
roman-mazhut May 28, 2024
74d9e77
Cert pool moved to the server struct
roman-mazhut May 28, 2024
09e549d
Prevent server tests from being looped forever
roman-mazhut May 28, 2024
d841bcf
testPlainTCPServer function added
roman-mazhut May 28, 2024
702563d
maybeUpgradeToTLS refactored
roman-mazhut May 28, 2024
b89c701
SecuredConnection refactored
roman-mazhut May 30, 2024
94a5706
TLS config TTL
roman-mazhut Jun 24, 2024
414711b
Client TLS config cache
roman-mazhut Jun 25, 2024
1ee36de
TLS Config manager factored out into a separate package
roman-mazhut Jul 2, 2024
c450333
Merge branch 'master' into add-support-of-tls-to-tcp-client
roman-mazhut Jul 4, 2024
7997a01
Metric added for upgrade to tls errors
roman-mazhut Jul 8, 2024
8fd3c43
newConfigManagerScope renamed to newConfigManagerMetrics
roman-mazhut Jul 9, 2024
2c78899
Config manager mutex moved to a field
roman-mazhut Jul 9, 2024
19e99e0
Redundant error check removed
roman-mazhut Jul 9, 2024
3068241
Write/read data tests added to secured connection
roman-mazhut Jul 9, 2024
1f1444d
Use tally.TestScope for metrics testing
roman-mazhut Jul 9, 2024
4e05948
Use t.Cleanup to close the tls server
roman-mazhut Jul 9, 2024
ec56885
Waiting for handler calls refactored
roman-mazhut Jul 9, 2024
f2594b2
Early returns refactoring
roman-mazhut Jul 9, 2024
d53144b
Server tests refactored into a table test
roman-mazhut Jul 9, 2024
8582081
bufio.Reader replaced with a peek function
roman-mazhut Jul 11, 2024
89e7e36
Server benchmark
roman-mazhut Jul 12, 2024
161a547
Tests for KeepAlive
roman-mazhut Jul 12, 2024
c4fb2d2
peekedByte pointer replaced with byte and peekedByteIsSet. Mutex removed
roman-mazhut Jul 12, 2024
96aa72c
ServerMode methods generated with enumer
roman-mazhut Jul 25, 2024
cae4342
Merge branch 'master' into add-support-of-tls-to-tcp-client
roman-mazhut Jul 29, 2024
6a44f2e
Linter fixed
roman-mazhut Jul 30, 2024
e848c97
Linter fixed
roman-mazhut Jul 30, 2024
a07157d
Linter fixed
roman-mazhut Jul 30, 2024
001ccb3
Imports fixed
roman-mazhut Jul 30, 2024
2e39e94
Imports fixed
roman-mazhut Jul 30, 2024
ed12ea4
Tests fixed
roman-mazhut Jul 30, 2024
2a2a17e
TLS tests fixed
roman-mazhut Jul 30, 2024
1b3ec54
loadCertPool function fixed
roman-mazhut Jul 30, 2024
5a81da4
Add metrics for time taken to connected to m3db cluster during startu…
pranithraparthi Jul 30, 2024
b582bc5
[buildkite] Fix integration dbnode lru and dbnode recently read tests…
kentzeng12 Jul 31, 2024
8ba3134
[buildkite] Fix Docker and Doc build test in buildkite pipeline (#4282)
kentzeng12 Jul 31, 2024
e8b051c
Master merged
roman-mazhut Aug 15, 2024
f35027c
Linter errors fixed
roman-mazhut Aug 15, 2024
ace2a95
Benchmark test fixed
roman-mazhut Aug 15, 2024
2e9ed48
Linter errors fixed
roman-mazhut Aug 15, 2024
343a770
Merge branch 'master' into add-support-of-tls-to-tcp-client
roman-mazhut Oct 2, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions src/aggregator/client/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,27 @@ func (c *Configuration) NewClientOptions(
return opts, nil
}

// TLSConfiguration contains the TLS configuration
type TLSConfiguration struct {
TLSEnabled bool `yaml:"tlsEnabled"`
roman-mazhut marked this conversation as resolved.
Show resolved Hide resolved
InsecureSkipVerify bool `yaml:"insecureSkipVerify"`
ServerName string `yaml:"serverName"`
CAFile string `yaml:"caFile"`
CertFile string `yaml:"certFile"`
KeyFile string `yaml:"keyFile"`
}

// NewTLSOptions creates new TLS options
func (c *TLSConfiguration) NewTLSOptions() TLSOptions {
return NewTLSOptions().
SetTLSEnabled(c.TLSEnabled).
SetInsecureSkipVerify(c.InsecureSkipVerify).
SetServerName(c.ServerName).
SetCAFile(c.CAFile).
SetCertFile(c.CertFile).
SetKeyFile(c.KeyFile)
}

// ConnectionConfiguration contains the connection configuration.
type ConnectionConfiguration struct {
ConnectionTimeout time.Duration `yaml:"connectionTimeout"`
Expand All @@ -217,6 +238,7 @@ type ConnectionConfiguration struct {
ReconnectThresholdMultiplier int `yaml:"reconnectThresholdMultiplier"`
MaxReconnectDuration *time.Duration `yaml:"maxReconnectDuration"`
WriteRetries *retry.Configuration `yaml:"writeRetries"`
TLS *TLSConfiguration `yaml:"tls"`
}

// NewConnectionOptions creates new connection options.
Expand Down Expand Up @@ -247,6 +269,9 @@ func (c *ConnectionConfiguration) NewConnectionOptions(scope tally.Scope) Connec
retryOpts := c.WriteRetries.NewOptions(scope)
opts = opts.SetWriteRetryOptions(retryOpts)
}
if c.TLS != nil {
opts = opts.SetTLSOptions(c.TLS.NewTLSOptions())
}
return opts
}

Expand Down
19 changes: 19 additions & 0 deletions src/aggregator/client/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,13 @@ connection:
maxBackoff: 1s
maxRetries: 2
jitter: true
tls:
tlsEnabled: false
insecureSkipVerify: true
serverName: TestServer
caFile: /tmp/ca
certFile: /tmp/cert
keyFile: /tmp/key
`

func TestConfigUnmarshal(t *testing.T) {
Expand Down Expand Up @@ -120,6 +127,12 @@ func TestConfigUnmarshal(t *testing.T) {
require.Equal(t, time.Second, cfg.Connection.WriteRetries.MaxBackoff)
require.Equal(t, 2, cfg.Connection.WriteRetries.MaxRetries)
require.Equal(t, true, *cfg.Connection.WriteRetries.Jitter)
require.False(t, cfg.Connection.TLS.TLSEnabled)
require.True(t, cfg.Connection.TLS.InsecureSkipVerify)
require.Equal(t, "TestServer", cfg.Connection.TLS.ServerName)
require.Equal(t, "/tmp/ca", cfg.Connection.TLS.CAFile)
require.Equal(t, "/tmp/cert", cfg.Connection.TLS.CertFile)
require.Equal(t, "/tmp/key", cfg.Connection.TLS.KeyFile)
require.Nil(t, cfg.Connection.WriteRetries.Forever)
}

Expand Down Expand Up @@ -171,4 +184,10 @@ func TestNewClientOptions(t *testing.T) {
require.Equal(t, 2, opts.ConnectionOptions().WriteRetryOptions().MaxRetries())
require.Equal(t, true, opts.ConnectionOptions().WriteRetryOptions().Jitter())
require.Equal(t, false, opts.ConnectionOptions().WriteRetryOptions().Forever())
require.False(t, opts.ConnectionOptions().TLSOptions().TLSEnabled())
require.True(t, opts.ConnectionOptions().TLSOptions().InsecureSkipVerify())
require.Equal(t, "TestServer", opts.ConnectionOptions().TLSOptions().ServerName())
require.Equal(t, "/tmp/ca", opts.ConnectionOptions().TLSOptions().CAFile())
require.Equal(t, "/tmp/cert", opts.ConnectionOptions().TLSOptions().CertFile())
require.Equal(t, "/tmp/key", opts.ConnectionOptions().TLSOptions().KeyFile())
}
43 changes: 43 additions & 0 deletions src/aggregator/client/conn.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,13 @@ package client

import (
"context"
"crypto/tls"
"crypto/x509"
"errors"
"fmt"
"math/rand"
"net"
"os"
"sync"
"time"

Expand Down Expand Up @@ -77,6 +81,7 @@ type connection struct {
mtx sync.Mutex
keepAlive bool
dialer xnet.ContextDialerFn
tls TLSOptions
}

// newConnection creates a new connection.
Expand All @@ -101,6 +106,7 @@ func newConnection(addr string, opts ConnectionOptions) *connection {
xio.ResettableWriterOptions{WriteBufferSize: 0},
),
metrics: newConnectionMetrics(opts.InstrumentOptions().MetricsScope()),
tls: opts.TLSOptions(),
}
c.connectWithLockFn = c.connectWithLock
c.writeWithLockFn = c.writeWithLock
Expand Down Expand Up @@ -152,6 +158,34 @@ func (c *connection) Close() {
c.mtx.Unlock()
}

func (c *connection) upgradeToTLS(conn net.Conn) (net.Conn, error) {
certPool := x509.NewCertPool()
roman-mazhut marked this conversation as resolved.
Show resolved Hide resolved
if c.tls.CAFile() != "" {
certs, err := os.ReadFile(c.tls.CAFile())
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we be caching the cert file? We recreate connections with some amount of frequency.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Or maybe more appropriately, it just goes in the pool.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have added a TTL config cache on the connection level. It will be helpful for reconnecting but not for establishing new connections. The client has fewer connections than the server, so I believe it will be a neglectable overhead.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, fair enough. Just for my understanding though--why not use the same cache for connecting as well?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's because the write manager is responsible for creating connections(it can be considered as a connection pool). Theoretically, it can contain TLS options and use its TLS config cache to establish a connection. However, it knows nothing about connection parameters, and I don't want it to have that information because it doesn't seem to be something that should be responsible for secure connections. Also, even if it would manage the TLS configuration, a connection should do certificate rotation on its own in case of reconnection.

if err != nil {
return conn, fmt.Errorf("read bundle error: %w", err)
}
if ok := certPool.AppendCertsFromPEM(certs); !ok {
return conn, fmt.Errorf("cannot append cert to cert pool")
}
}
tlsConfig := &tls.Config{
RootCAs: certPool,
InsecureSkipVerify: c.tls.InsecureSkipVerify(),
ServerName: c.tls.ServerName(),
}
if c.tls.CertFile() != "" && c.tls.KeyFile() != "" {
tlsConfig.GetClientCertificate = func(*tls.CertificateRequestInfo) (*tls.Certificate, error) {
cert, err := tls.LoadX509KeyPair(c.tls.CertFile(), c.tls.KeyFile())
if err != nil {
return nil, fmt.Errorf("load x509 key pair error: %w", err)
}
return &cert, nil
}
}
return tls.Client(conn, tlsConfig), nil
}

// writeAttemptWithLock attempts to establish a new connection and writes raw bytes
// to the connection while holding the write lock.
// If the write succeeds, c.conn is guaranteed to be a valid connection on return.
Expand Down Expand Up @@ -192,6 +226,15 @@ func (c *connection) connectWithLock() error {
}
}

if c.tls.TLSEnabled() {
conn, err = c.upgradeToTLS(conn)
if err != nil {
roman-mazhut marked this conversation as resolved.
Show resolved Hide resolved
c.metrics.connectError.Inc(1)
conn.Close()
return err
}
}

if c.conn != nil {
c.conn.Close() // nolint: errcheck
}
Expand Down
18 changes: 18 additions & 0 deletions src/aggregator/client/conn_options.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,12 @@ type ConnectionOptions interface {
// RWOptions returns the RW options.
RWOptions() xio.Options

// SetTLSOptions sets TLS options
SetTLSOptions(value TLSOptions) ConnectionOptions

// TLSOptions returns the TLS options
TLSOptions() TLSOptions

// ContextDialer allows customizing the way an aggregator client the aggregator, at the TCP layer.
// By default, this is:
// (&net.ContextDialer{}).DialContext. This can be used to do a variety of things, such as forwarding a connection
Expand All @@ -137,6 +143,7 @@ type connectionOptions struct {
maxThreshold int
multiplier int
connKeepAlive bool
tlsOptions TLSOptions
dialer xnet.ContextDialerFn
}

Expand All @@ -159,6 +166,7 @@ func NewConnectionOptions() ConnectionOptions {
multiplier: defaultReconnectThresholdMultiplier,
maxDuration: defaultMaxReconnectDuration,
writeRetryOpts: defaultWriteRetryOpts,
tlsOptions: NewTLSOptions(),
rwOpts: xio.NewOptions(),
dialer: nil, // Will default to net.Dialer{}.DialContext
}
Expand Down Expand Up @@ -274,6 +282,16 @@ func (o *connectionOptions) RWOptions() xio.Options {
return o.rwOpts
}

func (o *connectionOptions) SetTLSOptions(value TLSOptions) ConnectionOptions {
opts := *o
opts.tlsOptions = value
return &opts
}

func (o *connectionOptions) TLSOptions() TLSOptions {
return o.tlsOptions
}

func (o *connectionOptions) ContextDialer() xnet.ContextDialerFn {
return o.dialer
}
Expand Down
83 changes: 83 additions & 0 deletions src/aggregator/client/conn_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,13 @@ package client

import (
"context"
"crypto/tls"
"crypto/x509"
"errors"
"fmt"
"math"
"net"
"os"
"sync"
"testing"
"time"
Expand Down Expand Up @@ -405,6 +408,76 @@ func TestConnectWriteToServer(t *testing.T) {
require.Nil(t, conn.conn)
}

func TestTLSConnectWriteToServer(t *testing.T) {
data := []byte("foobar")

// Start tls server.
var wg sync.WaitGroup
wg.Add(1)

serverCert, err := tls.LoadX509KeyPair("./testdata/server.crt", "./testdata/server.key")
require.NoError(t, err)
certPool := x509.NewCertPool()
certs, err := os.ReadFile("./testdata/rootCA.crt")
require.NoError(t, err)
certPool.AppendCertsFromPEM(certs)
l, err := tls.Listen(tcpProtocol, testLocalServerAddr, &tls.Config{
Certificates: []tls.Certificate{serverCert},
ClientCAs: certPool,
ClientAuth: tls.RequireAndVerifyClientCert,
})
require.NoError(t, err)
serverAddr := l.Addr().String()

go func() {
defer wg.Done()

// Ignore the first testing connection.
conn, err := l.Accept()
tlsConn, ok := conn.(*tls.Conn)
require.True(t, ok)
tlsConn.Handshake()
require.NoError(t, err)
require.NoError(t, conn.Close())

// Read from the second connection.
conn, err = l.Accept()
require.NoError(t, err)
buf := make([]byte, 1024)
n, err := conn.Read(buf)
require.NoError(t, err)
require.Equal(t, data, buf[:n])
conn.Close() // nolint: errcheck
}()

clientCert, err := tls.LoadX509KeyPair("./testdata/client.crt", "./testdata/client.key")
require.NoError(t, err)
// Wait until the server starts up.
dialer := net.Dialer{Timeout: time.Minute}
testConn, err := tls.DialWithDialer(&dialer, tcpProtocol, serverAddr, &tls.Config{
InsecureSkipVerify: true,
Certificates: []tls.Certificate{clientCert},
RootCAs: certPool,
})
require.NoError(t, err)
require.NoError(t, testConn.Close())

// Create a new connection and assert we can write successfully.
opts := testTLSConnectionOptions().SetInitReconnectThreshold(0)
conn := newConnection(serverAddr, opts)
require.NoError(t, conn.Write(data))
require.Equal(t, 0, conn.numFailures)
require.NotNil(t, conn.conn)

// Stop the server.
l.Close() // nolint: errcheck
roman-mazhut marked this conversation as resolved.
Show resolved Hide resolved
wg.Wait()

// Close the connection
conn.Close()
require.Nil(t, conn.conn)
}

func testConnectionOptions() ConnectionOptions {
return NewConnectionOptions().
SetClockOptions(clock.NewOptions()).
Expand All @@ -416,6 +489,16 @@ func testConnectionOptions() ConnectionOptions {
SetWriteTimeout(100 * time.Millisecond)
}

func testTLSConnectionOptions() ConnectionOptions {
tlsOptions := NewTLSOptions().
SetTLSEnabled(true).
SetInsecureSkipVerify(true).
SetCAFile("./testdata/rootCA.crt").
SetCertFile("./testdata/client.crt").
SetKeyFile("./testdata/client.key")
return testConnectionOptions().SetTLSOptions(tlsOptions)
}

func testConnectionProperties() *gopter.Properties {
params := gopter.DefaultTestParameters()
params.Rng.Seed(testRandomSeeed)
Expand Down
1 change: 1 addition & 0 deletions src/aggregator/client/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,7 @@ type options struct {
maxBatchSize int
flushWorkerCount int
aggregatorClientType AggregatorClientType
tlsOptions TLSOptions
}

// NewOptions creates a new set of client options.
Expand Down
20 changes: 20 additions & 0 deletions src/aggregator/client/testdata/client.crt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
-----BEGIN CERTIFICATE-----
MIIDPzCCAicCFFJVDW2T6lamcRZYStsBCQTKicKwMA0GCSqGSIb3DQEBCwUAMFox
CzAJBgNVBAYTAk5MMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRl
cm5ldCBXaWRnaXRzIFB0eSBMdGQxEzARBgNVBAMMClRlc3RSb290Q0EwHhcNMjQw
NDE1MTQ0NjEyWhcNMzQwNDEzMTQ0NjEyWjBeMQswCQYDVQQGEwJOTDETMBEGA1UE
CAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRk
MRcwFQYDVQQDDA5UZXN0Q2xpZW50Q2VydDCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBAMXgv5tgZD5iBW3LfTC27jPHTLlsAw8ZlBFLmd7potdS3Hy512Xa
kKOaKRKH/0Yla4BKGNh0ZP+xege15CpTFqwtzDPCRkaRvfSxRW19MukeergRDqqI
tEwURHQ5gfub7XB9e5wuNmW2GGs/xgiWsxxm6UMidXkhA5a2//OmDSm2JdcoxJbk
1m1OUzXUuLKLzCIRAbJFFIM1RpvjWSonxpJ2lsNCVQ+LdItxE9mAI+Y+PaDonyzg
ehfAqkl+wxGRevaDFFJr1defxmnJhaYv40AcEpXOWeetZFlspEtrPF7b/3GifRdx
Mlwq27wn3mk4wF1wa12kRNKiz+HHjZrB7UECAwEAATANBgkqhkiG9w0BAQsFAAOC
AQEAKblZ+C4Pdv5grKiCQcfFt53SbIys8uavxmzJNn9nq1QVgBmR/hX8yG8ULeh5
kKrccwe2WXCBWsIj9cvGCzR+MPMvuIXd3d58yLybmIUBDfJSBC0v5TaNWP2ZdJDG
fH38DfQTeE9XcjpRtCGYtYwReBptSlNiYQlvwkukTNz3mV+0BpvQu/9/R0BNCJAF
9VeLgUcG7T7HC+foCeU7h83Y0xH0OALe33ntcrMPHUclXqImCiC7dl8pb3H7o/xJ
jS3KZxfv6ioxpirvpEbX/EeF+H1HQZUZ8y3+J3K37jMgzNamd/xsaJxEfCq4SE+n
HmgeXgqoNjrM6J0jYAfx1MjbIA==
-----END CERTIFICATE-----
27 changes: 27 additions & 0 deletions src/aggregator/client/testdata/client.key
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAxeC/m2BkPmIFbct9MLbuM8dMuWwDDxmUEUuZ3umi11LcfLnX
ZdqQo5opEof/RiVrgEoY2HRk/7F6B7XkKlMWrC3MM8JGRpG99LFFbX0y6R56uBEO
qoi0TBREdDmB+5vtcH17nC42ZbYYaz/GCJazHGbpQyJ1eSEDlrb/86YNKbYl1yjE
luTWbU5TNdS4sovMIhEBskUUgzVGm+NZKifGknaWw0JVD4t0i3ET2YAj5j49oOif
LOB6F8CqSX7DEZF69oMUUmvV15/GacmFpi/jQBwSlc5Z561kWWykS2s8Xtv/caJ9
F3EyXCrbvCfeaTjAXXBrXaRE0qLP4ceNmsHtQQIDAQABAoIBAAtyP8MuJT5SjzvV
rI0317mZCsAjFl42PZFujR0O6MOJ4IU6ftI+fWVpUnzm7wZQvdIy9xL2UK1Vx9hQ
Vj14hvQ4xfosf8IvRgy0gG6f8mT3xWOGYRHOTJemCHuso+85CtgZ+h+DsNPbX7g8
fSkcBopbDZ07jg4OsdVzCoU+kr5Z1/VDe0O0rTDzGVP686tN9I+DmDYv2HlBUaSZ
SyNZrLJFziqFx4ATTIE3aTLd29pzTl09WiCcZSxhlS+ROnN2iW2xDLNgY9SdUo2a
3r8N+xhYDNQz2paxlsv2x/tCRJvrQDoX7S5QZw4P1pVr6wo6xC+BU2UlpVHifo4M
egyDbAECgYEA5Y9+JDOSQF2cvIV4xTMgVnkLig/ngYesS44xz8HYTRR5s1WW6oCX
3j+OosZBbJpXeBlTK31G9Z92+Om2/Cj2uDvff7EJdhZ5sAdMtUy5X7p9rGTEyi5F
ecZDBfmwHH0lFdwpNtlky1uoaUsVd4IS28WMHoHYDGW241IW8xOlmeECgYEA3Ksb
KR7JCbHx21wh5oPVn5BLpdag7D+M1jBFtjPrzLDNhXlsV9zkjn7xETvTXWU2vNlh
OkoRu4VFEAnsgtxh+gT0lo9ZG9IWi2qP99vPpB3AFYuujBu3GA02/iOo5pri/6R0
ZNEEreAaaOcT2z6K9HG0KMQ6QpYgXSlzJW8sf2ECgYEAvn2fMA03bIAB4xJi0EkH
qZoScEOYWQ0rdRsOzJbPlc7K2nzImdmRrFRTWVFo0uUUdk2VjX4Mlx/3ir/uHzsi
2GieowhWkI4/9kloZv2+yegoBxkrj5ZsAov57AhxEoLqdkRWUvR8xp9Nleo/awcd
/Q7loh8fF9KDvAjPkHAaOCECgYA98bZNI7wxgYcwGbvWdrmX8iyaIBbKWsiRM7nN
/OM7cYIv7rbwLyzlp1LKkK2zsP7donP9pd82caHCb9a5oV3LjmqOfSz5d08m0cIa
RNUT79oE8lIMOJd8I/GFA8OdAGuqcaLOzjHvEVK4ke1sBTGCjwyQyQzFtljdbg5J
utyV4QKBgHkSBKwrgaump08MJFfK9uFo5sr5jy692XYWMlBVhc+piPwUsoztjI1O
8cvie0mMj6oofSoSyD4FUg9kFUCRMPC0kga/zlHyL1Y/uILX4XUFMl4P/gMbC7kw
0d6BdEsp5SU8Onc9eV/EW+q2Mz7/t5ZHkUrdDQYGgkIBqRZcXlka
-----END RSA PRIVATE KEY-----
22 changes: 22 additions & 0 deletions src/aggregator/client/testdata/rootCA.crt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
-----BEGIN CERTIFICATE-----
MIIDlTCCAn2gAwIBAgIUUwZEZu6XUKW03HPLHGDlt/d/BeUwDQYJKoZIhvcNAQEL
BQAwWjELMAkGA1UEBhMCTkwxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDETMBEGA1UEAwwKVGVzdFJvb3RDQTAe
Fw0yNDA0MDQxMTAwMzhaFw0zNDAxMDIxMTAwMzhaMFoxCzAJBgNVBAYTAk5MMRMw
EQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0
eSBMdGQxEzARBgNVBAMMClRlc3RSb290Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IB
DwAwggEKAoIBAQDRwn7QLv6zup98kB9VJ1HvHQQMZxt2tqhpFGEc0bXiGrmhFKjV
XZ264ALnUJHQgM8rkRe+dTXg8455FPTMoT+O/BC44pt8CaY1C5kQzVkLaMwaVVxV
vsBfdZ9LOKJQmUXIf1qV/UK3P55Oc3TvwSQW3tU0eMMEOnuNdA4lDdlQnExb7tIJ
4sl0i2w6rB7CoS/0gx2eUPLhPK+vcwCM3d81Odb3ULVznyJ5ZUd5mYY85XXVFQdW
QSyaEE0ekzbmXQzjiqNAt67WEmbadoKdeg8jPG5ka8qBZ21ZGjCHQ8AbzpOn+eDk
n50zwxncpSYVxTilV70PbFSY33PdmdS6XjEnAgMBAAGjUzBRMB0GA1UdDgQWBBSo
kzZddlleTXZYQsBc8efmsZj3WTAfBgNVHSMEGDAWgBSokzZddlleTXZYQsBc8efm
sZj3WTAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQACb1ZT3WPK
XdO6jYbZuMN5BBET+mNKQOYrdehY5oiLgr5sDwTwfZvf+q6ic7MpDRBOWMSQuYwp
aUxK7qfw4nSSZb4zDPpzB6Tauh7M5TTPYQwzesn9/JaUBO4vCTwOFGuWxEbXe6PF
VuQOyGQCR9a7juNgoDLiRpWi+xXHz1kMNSeZqV8bn7eo/SIziuSW1JScse91Brt1
Db9L8iSJpKLDLtwv8fU4/NSORc/672uy4OLxNppsTthh1rk94KbC/FYllC6e8N8n
0iffEn4xE/CECYmAhvplXXS20hCTGbs7tPJ3DGsRfHOyI9RXiayNZuq9GIYKv6eR
+h7NYwXua7oP
-----END CERTIFICATE-----
Loading