Skip to content

Commit 9beebee

Browse files
author
Divjot Arora
authored
GODRIVER-1580 Accept multiple certificates in a CA file (#389)
1 parent a484eb6 commit 9beebee

8 files changed

+229
-68
lines changed

mongo/options/clientoptions.go

Lines changed: 3 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -814,47 +814,14 @@ func addCACertFromFile(cfg *tls.Config, file string) error {
814814
return err
815815
}
816816

817-
certBytes, err := loadCACert(data)
818-
if err != nil {
819-
return fmt.Errorf("error loading CA cert: %v", err)
820-
}
821-
822-
cert, err := x509.ParseCertificate(certBytes)
823-
if err != nil {
824-
return err
825-
}
826-
827817
if cfg.RootCAs == nil {
828818
cfg.RootCAs = x509.NewCertPool()
829819
}
830-
831-
cfg.RootCAs.AddCert(cert)
832-
833-
return nil
834-
}
835-
836-
func loadCACert(data []byte) ([]byte, error) {
837-
var certBlock *pem.Block
838-
839-
for certBlock == nil {
840-
if data == nil || len(data) == 0 {
841-
return nil, errors.New("no CERTIFICATE section found")
842-
}
843-
844-
block, rest := pem.Decode(data)
845-
if block == nil {
846-
return nil, errors.New("invalid .pem file")
847-
}
848-
849-
switch block.Type {
850-
case "CERTIFICATE":
851-
certBlock = block
852-
}
853-
854-
data = rest
820+
if !cfg.RootCAs.AppendCertsFromPEM(data) {
821+
return errors.New("the specified CA file does not contain any valid certificates")
855822
}
856823

857-
return certBlock.Bytes, nil
824+
return nil
858825
}
859826

860827
func addClientCertFromSeparateFiles(cfg *tls.Config, keyFile, certFile, keyPassword string) (string, error) {

mongo/options/clientoptions_test.go

Lines changed: 71 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
package options
22

33
import (
4+
"bytes"
45
"context"
56
"crypto/tls"
67
"crypto/x509"
8+
"encoding/pem"
79
"errors"
810
"fmt"
911
"io/ioutil"
1012
"net"
1113
"os"
1214
"reflect"
13-
"strings"
1415
"testing"
1516
"time"
1617

@@ -353,7 +354,9 @@ func TestClientOptions(t *testing.T) {
353354
{
354355
"TLS CACertificate",
355356
"mongodb://localhost/?ssl=true&sslCertificateAuthorityFile=testdata/ca.pem",
356-
baseClient().SetTLSConfig(&tls.Config{RootCAs: x509.NewCertPool()}),
357+
baseClient().SetTLSConfig(&tls.Config{
358+
RootCAs: createCertPool(t, "testdata/ca.pem"),
359+
}),
357360
},
358361
{
359362
"TLS Insecure",
@@ -443,6 +446,38 @@ func TestClientOptions(t *testing.T) {
443446
"mongodb://localhost/?directConnection=true",
444447
baseClient().SetDirect(true),
445448
},
449+
{
450+
"TLS CA file with multiple certificiates",
451+
"mongodb://localhost/?tlsCAFile=testdata/ca-with-intermediates.pem",
452+
baseClient().SetTLSConfig(&tls.Config{
453+
RootCAs: createCertPool(t, "testdata/ca-with-intermediates-first.pem",
454+
"testdata/ca-with-intermediates-second.pem", "testdata/ca-with-intermediates-third.pem"),
455+
}),
456+
},
457+
{
458+
"TLS empty CA file",
459+
"mongodb://localhost/?tlsCAFile=testdata/empty-ca.pem",
460+
&ClientOptions{
461+
Hosts: []string{"localhost"},
462+
err: errors.New("the specified CA file does not contain any valid certificates"),
463+
},
464+
},
465+
{
466+
"TLS CA file with no certificates",
467+
"mongodb://localhost/?tlsCAFile=testdata/ca-key.pem",
468+
&ClientOptions{
469+
Hosts: []string{"localhost"},
470+
err: errors.New("the specified CA file does not contain any valid certificates"),
471+
},
472+
},
473+
{
474+
"TLS malformed CA file",
475+
"mongodb://localhost/?tlsCAFile=testdata/malformed-ca.pem",
476+
&ClientOptions{
477+
Hosts: []string{"localhost"},
478+
err: errors.New("the specified CA file does not contain any valid certificates"),
479+
},
480+
},
446481
}
447482

448483
for _, tc := range testCases {
@@ -470,36 +505,6 @@ func TestClientOptions(t *testing.T) {
470505
})
471506
}
472507
})
473-
t.Run("loadCACert", func(t *testing.T) {
474-
caData := readFile(t, "testdata/ca.pem")
475-
keyData := readFile(t, "testdata/ca-key.pem")
476-
noCertErr := errors.New("no CERTIFICATE section found")
477-
malformedErr := errors.New("invalid .pem file")
478-
479-
testCases := []struct {
480-
name string
481-
data []byte
482-
err error
483-
}{
484-
{"file with certificate succeeds", caData, nil},
485-
{"empty file errors", []byte{}, noCertErr},
486-
{"file with no certificate errors", keyData, noCertErr},
487-
{"file with malformed data errors", []byte{1, 2, 3}, malformedErr},
488-
}
489-
for _, tc := range testCases {
490-
t.Run(tc.name, func(t *testing.T) {
491-
_, err := loadCACert(tc.data)
492-
if tc.err == nil {
493-
assert.Nil(t, err, "loadCACert error: %v", err)
494-
return
495-
}
496-
497-
assert.NotNil(t, err, "expected error %v, got nil", tc.err)
498-
containsMsg := strings.Contains(err.Error(), tc.err.Error())
499-
assert.True(t, containsMsg, "expected error %v, got %v", tc.err, err)
500-
})
501-
}
502-
})
503508
t.Run("direct connection validation", func(t *testing.T) {
504509
t.Run("multiple hosts", func(t *testing.T) {
505510
expectedErr := errors.New("a direct connection cannot be made if multiple hosts are specified")
@@ -532,6 +537,26 @@ func TestClientOptions(t *testing.T) {
532537
})
533538
}
534539

540+
func createCertPool(t *testing.T, paths ...string) *x509.CertPool {
541+
t.Helper()
542+
543+
pool := x509.NewCertPool()
544+
for _, path := range paths {
545+
pool.AddCert(loadCert(t, path))
546+
}
547+
return pool
548+
}
549+
550+
func loadCert(t *testing.T, file string) *x509.Certificate {
551+
t.Helper()
552+
553+
data := readFile(t, file)
554+
block, _ := pem.Decode(data)
555+
cert, err := x509.ParseCertificate(block.Bytes)
556+
assert.Nil(t, err, "ParseCertificate error for %s: %v", file, err)
557+
return cert
558+
}
559+
535560
func readFile(t *testing.T, path string) []byte {
536561
data, err := ioutil.ReadFile(path)
537562
assert.Nil(t, err, "ReadFile error for %s: %v", path, err)
@@ -559,6 +584,20 @@ func compareTLSConfig(cfg1, cfg2 *tls.Config) bool {
559584
return false
560585
}
561586

587+
if cfg1.RootCAs != nil {
588+
cfg1Subjects := cfg1.RootCAs.Subjects()
589+
cfg2Subjects := cfg2.RootCAs.Subjects()
590+
if len(cfg1Subjects) != len(cfg2Subjects) {
591+
return false
592+
}
593+
594+
for idx, firstSubject := range cfg1Subjects {
595+
if !bytes.Equal(firstSubject, cfg2Subjects[idx]) {
596+
return false
597+
}
598+
}
599+
}
600+
562601
if len(cfg1.Certificates) != len(cfg2.Certificates) {
563602
return false
564603
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDdDCCAlwCBBmRIxIwDQYJKoZIhvcNAQELBQAwdDELMAkGA1UEBhMCVVMxETAP
3+
BgNVBAgMCE5ldyBZb3JrMRYwFAYDVQQHDA1OZXcgWW9yayBDaXR5MRAwDgYDVQQK
4+
DAdNb25nb0RCMQ8wDQYDVQQLDAZLZXJuZWwxFzAVBgNVBAMMDktlcm5lbCBUZXN0
5+
IENBMB4XDTE5MDkyNTIzMjczOVoXDTM5MDkyNzIzMjczOVowdDELMAkGA1UEBhMC
6+
VVMxETAPBgNVBAgMCE5ldyBZb3JrMRYwFAYDVQQHDA1OZXcgWW9yayBDaXR5MRAw
7+
DgYDVQQKDAdNb25nb0RCMQ8wDQYDVQQLDAZLZXJuZWwxFzAVBgNVBAMMDktlcm5l
8+
bCBUZXN0IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAupVkx8+n
9+
AqzsANKwNPeCYlf2q0WgF4kSUMNJdpmMelrr7hh7EOnAU0hTAQx9BKTEbExeCzH6
10+
OArFNGjewjWVXwaOpCjK8FMvK6/lGVEpmoHNF9XuiQVmaQ4bJD6rC73YjpgNIPeL
11+
5PyoFLEZv+X2cRBPpTcSRcf87tk8HL7v0eyk1JBhkeKK68SYdWwZlHaa1jqwmliW
12+
WvVMkHVH3lx0VOgQwWtOgs0K1zpcZ0sH5MGpYRQOiidIRZj3PkKeTPQe2D6VQQtv
13+
2yDs9dWfCxJJP9QiWclL2rF/xqlFSNEIfNZpZhk6I1DHQpA2uyJfzRH62pFasJuB
14+
CVh5Tr0EDoVreQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
15+
CwUAA4IBAQARdNCYYWxi2fyhJwzGHwIT261d/pTlOSYLlm84c72aEneFUnfp8/H5
16+
JjuFbnhiX+5+h3M7eDQhra9s+H3vKr7o38EIVf5OKXvpNLwv1UUmomBvKqccioYh
17+
bxrfwCzfBRuUmW05kcAVn8iKovqyxL7npEZbckwtT+BqZ4kOL4Uzre+S1HMx0zOu
18+
xulSYA/sBoJ2BB93ZIAqB+f/+InS9yggzyhhaQqS7QEl1L4nZE4Oy0jKcxdCzysm
19+
TqiyH+OI5SVRTfXh4XvHmdWBBaQyaTmQzXYUxUi7jg1jEAiebCGrEJv9plwq4KfC
20+
cze9NLBjaXR3GzonT8kICyVT/0UvhuJg
21+
-----END CERTIFICATE-----
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDcjCCAloCBFNvXv0wDQYJKoZIhvcNAQELBQAwdDELMAkGA1UEBhMCVVMxETAP
3+
BgNVBAgMCE5ldyBZb3JrMRYwFAYDVQQHDA1OZXcgWW9yayBDaXR5MRAwDgYDVQQK
4+
DAdNb25nb0RCMQ8wDQYDVQQLDAZLZXJuZWwxFzAVBgNVBAMMDktlcm5lbCBUZXN0
5+
IENBMB4XDTE5MTAxNjE3NTc0OVoXDTM5MTAxODE3NTc0OVowdTELMAkGA1UEBhMC
6+
VVMxETAPBgNVBAgMCE5ldyBZb3JrMRYwFAYDVQQHDA1OZXcgWW9yayBDaXR5MRAw
7+
DgYDVQQKDAdNb25nb0RCMQ8wDQYDVQQLDAZLZXJuZWwxGDAWBgNVBAMMD0ludGVy
8+
bWVkaWF0ZSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOcrt0K/
9+
K8ueq9lQ9wVtA+rka82FPaHXpZkH7ii/ZJlNcDXLaJPdRb7XgAabAS3gru+Hpm/g
10+
kAofoL7cDmGZRAbiW0I6X5Nlmjh4/0E6RxSs0urhU34m8sM3OPmAgbq7oLlFINZ6
11+
GbVR2RzMWhK5HPld8WApDkIVpBFbRGV7dt/LVKY34Nab9hu15WRSH3wzSHJvt8e1
12+
alYxaRUoE27Fk3zdHPw9Z91/XvfIThTsNXEQVOeaieyQLwoKx8tpMa/ck/mFmSkD
13+
nH4h37ev0ZABB04iTBfLGCpUCKd5LerYIqEu4UPp9r9czbco7twp+k8875pJ3bpV
14+
wMH0/jF68GTC8HsCAwEAAaMQMA4wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsF
15+
AAOCAQEAaL61HT6JD19Ok2LY6b5KkZ4oRhiV73l2/82X88GcV63Bl0rN6AF+W0ut
16+
GuHzSqcHV4qZkt9ezNoDYq41BsV4I8Cxvyaz8is956uyrzQAsVCzidZSGeq2GIfV
17+
9y+IRISBRdzXQHrB0ni93b16MJO1KoJxZbXcb8W9ll2URp+YEnHIrhWpDcMcHN3O
18+
mjoy1+WpHDXpNK2D3Xk5tT5pwxJZWRPB9wvPfTux5Vp07+Rkef9YjXL2ZZxt4vKu
19+
WU0HJWfK905HpbHjwFNRlbT39WWaF8VeJ2nT6OrXTpE8tDdPoeZt5u76eaWEmsf5
20+
gX2ClrsSmegOKT52V+2NAlKDjQkaDg==
21+
-----END CERTIFICATE-----
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDaTCCAlECBCLMKCQwDQYJKoZIhvcNAQELBQAwdTELMAkGA1UEBhMCVVMxETAP
3+
BgNVBAgMCE5ldyBZb3JrMRYwFAYDVQQHDA1OZXcgWW9yayBDaXR5MRAwDgYDVQQK
4+
DAdNb25nb0RCMQ8wDQYDVQQLDAZLZXJuZWwxGDAWBgNVBAMMD0ludGVybWVkaWF0
5+
ZSBDQTAeFw0xOTEwMTYxNzU3NDlaFw0zOTEwMTgxNzU3NDlaMH0xCzAJBgNVBAYT
6+
AlVTMREwDwYDVQQIDAhOZXcgWW9yazEWMBQGA1UEBwwNTmV3IFlvcmsgQ2l0eTEQ
7+
MA4GA1UECgwHTW9uZ29EQjEPMA0GA1UECwwGS2VybmVsMSAwHgYDVQQDDBdTZXJ2
8+
ZXIgVmlhIEludGVybWVkaWF0ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
9+
ggEBAKCj95jJi63dCJDKyTWQAJwgLtvqwPmIvBMbYMcmrolP3tYolwkkh6c0RJdP
10+
UTy4gJaLZ9b9B8GuiGFatG+ZzEqCUh6AlG1lGJwdyqyP2eotpzkZJhwLGFc81DUt
11+
7WKhZjHikgXcAd3VMCXsjv7/axvBnc459SpsCW5heOiJ3Ap8OJIrTuD4GAWW5cfW
12+
GYa1v07hqXZ7SEloRE5Hm5bItnZA9+A5QNCj2a2PqK3TlrtCnDP125iYHc4W/+NO
13+
1V9LPKpDffdJ7slhrX69k9oV8HTQBgu7lRHKQlprW64pg6EMsw/5hpGjpZkyG9J9
14+
L1FYrXqsagA1E5j87JQH+SJDOEUCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAPRu7
15+
YtgaGPx4O2IfvYoK+BsiD/55WylDp/0zxf/xipvuoPRcMgX1ORoNuQTPfeIMxlZS
16+
UAIRHQSjOZQkH0WL2dglqaoBhTXO6c0PUuWOUsDDwnZE8lj26Jkka6PC8d8t7gjt
17+
w/k2IRnhcklKOu6pNlcYi+/WGcWphmkjMRWeka0vqXab/bxF1sdeHD9bMY59QOwI
18+
FT0JCG8Wn0LSi6V/Ip35JV3CryBP1Jual2aCXIXEKm3m+P4NboRQTZ7zqIcJoA8S
19+
i2GkuHCPOhhQP2isiRRBILujcJxnRYrR7qNIqvMrmPx3va8fMrHKtWAx+bfo/EIJ
20+
hlU1Eyls7Xv83x3vaA==
21+
-----END CERTIFICATE-----
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDdDCCAlwCBBmRIxIwDQYJKoZIhvcNAQELBQAwdDELMAkGA1UEBhMCVVMxETAP
3+
BgNVBAgMCE5ldyBZb3JrMRYwFAYDVQQHDA1OZXcgWW9yayBDaXR5MRAwDgYDVQQK
4+
DAdNb25nb0RCMQ8wDQYDVQQLDAZLZXJuZWwxFzAVBgNVBAMMDktlcm5lbCBUZXN0
5+
IENBMB4XDTE5MDkyNTIzMjczOVoXDTM5MDkyNzIzMjczOVowdDELMAkGA1UEBhMC
6+
VVMxETAPBgNVBAgMCE5ldyBZb3JrMRYwFAYDVQQHDA1OZXcgWW9yayBDaXR5MRAw
7+
DgYDVQQKDAdNb25nb0RCMQ8wDQYDVQQLDAZLZXJuZWwxFzAVBgNVBAMMDktlcm5l
8+
bCBUZXN0IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAupVkx8+n
9+
AqzsANKwNPeCYlf2q0WgF4kSUMNJdpmMelrr7hh7EOnAU0hTAQx9BKTEbExeCzH6
10+
OArFNGjewjWVXwaOpCjK8FMvK6/lGVEpmoHNF9XuiQVmaQ4bJD6rC73YjpgNIPeL
11+
5PyoFLEZv+X2cRBPpTcSRcf87tk8HL7v0eyk1JBhkeKK68SYdWwZlHaa1jqwmliW
12+
WvVMkHVH3lx0VOgQwWtOgs0K1zpcZ0sH5MGpYRQOiidIRZj3PkKeTPQe2D6VQQtv
13+
2yDs9dWfCxJJP9QiWclL2rF/xqlFSNEIfNZpZhk6I1DHQpA2uyJfzRH62pFasJuB
14+
CVh5Tr0EDoVreQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
15+
CwUAA4IBAQARdNCYYWxi2fyhJwzGHwIT261d/pTlOSYLlm84c72aEneFUnfp8/H5
16+
JjuFbnhiX+5+h3M7eDQhra9s+H3vKr7o38EIVf5OKXvpNLwv1UUmomBvKqccioYh
17+
bxrfwCzfBRuUmW05kcAVn8iKovqyxL7npEZbckwtT+BqZ4kOL4Uzre+S1HMx0zOu
18+
xulSYA/sBoJ2BB93ZIAqB+f/+InS9yggzyhhaQqS7QEl1L4nZE4Oy0jKcxdCzysm
19+
TqiyH+OI5SVRTfXh4XvHmdWBBaQyaTmQzXYUxUi7jg1jEAiebCGrEJv9plwq4KfC
20+
cze9NLBjaXR3GzonT8kICyVT/0UvhuJg
21+
-----END CERTIFICATE-----
22+
-----BEGIN CERTIFICATE-----
23+
MIIDcjCCAloCBFNvXv0wDQYJKoZIhvcNAQELBQAwdDELMAkGA1UEBhMCVVMxETAP
24+
BgNVBAgMCE5ldyBZb3JrMRYwFAYDVQQHDA1OZXcgWW9yayBDaXR5MRAwDgYDVQQK
25+
DAdNb25nb0RCMQ8wDQYDVQQLDAZLZXJuZWwxFzAVBgNVBAMMDktlcm5lbCBUZXN0
26+
IENBMB4XDTE5MTAxNjE3NTc0OVoXDTM5MTAxODE3NTc0OVowdTELMAkGA1UEBhMC
27+
VVMxETAPBgNVBAgMCE5ldyBZb3JrMRYwFAYDVQQHDA1OZXcgWW9yayBDaXR5MRAw
28+
DgYDVQQKDAdNb25nb0RCMQ8wDQYDVQQLDAZLZXJuZWwxGDAWBgNVBAMMD0ludGVy
29+
bWVkaWF0ZSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOcrt0K/
30+
K8ueq9lQ9wVtA+rka82FPaHXpZkH7ii/ZJlNcDXLaJPdRb7XgAabAS3gru+Hpm/g
31+
kAofoL7cDmGZRAbiW0I6X5Nlmjh4/0E6RxSs0urhU34m8sM3OPmAgbq7oLlFINZ6
32+
GbVR2RzMWhK5HPld8WApDkIVpBFbRGV7dt/LVKY34Nab9hu15WRSH3wzSHJvt8e1
33+
alYxaRUoE27Fk3zdHPw9Z91/XvfIThTsNXEQVOeaieyQLwoKx8tpMa/ck/mFmSkD
34+
nH4h37ev0ZABB04iTBfLGCpUCKd5LerYIqEu4UPp9r9czbco7twp+k8875pJ3bpV
35+
wMH0/jF68GTC8HsCAwEAAaMQMA4wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsF
36+
AAOCAQEAaL61HT6JD19Ok2LY6b5KkZ4oRhiV73l2/82X88GcV63Bl0rN6AF+W0ut
37+
GuHzSqcHV4qZkt9ezNoDYq41BsV4I8Cxvyaz8is956uyrzQAsVCzidZSGeq2GIfV
38+
9y+IRISBRdzXQHrB0ni93b16MJO1KoJxZbXcb8W9ll2URp+YEnHIrhWpDcMcHN3O
39+
mjoy1+WpHDXpNK2D3Xk5tT5pwxJZWRPB9wvPfTux5Vp07+Rkef9YjXL2ZZxt4vKu
40+
WU0HJWfK905HpbHjwFNRlbT39WWaF8VeJ2nT6OrXTpE8tDdPoeZt5u76eaWEmsf5
41+
gX2ClrsSmegOKT52V+2NAlKDjQkaDg==
42+
-----END CERTIFICATE-----
43+
-----BEGIN CERTIFICATE-----
44+
MIIDaTCCAlECBCLMKCQwDQYJKoZIhvcNAQELBQAwdTELMAkGA1UEBhMCVVMxETAP
45+
BgNVBAgMCE5ldyBZb3JrMRYwFAYDVQQHDA1OZXcgWW9yayBDaXR5MRAwDgYDVQQK
46+
DAdNb25nb0RCMQ8wDQYDVQQLDAZLZXJuZWwxGDAWBgNVBAMMD0ludGVybWVkaWF0
47+
ZSBDQTAeFw0xOTEwMTYxNzU3NDlaFw0zOTEwMTgxNzU3NDlaMH0xCzAJBgNVBAYT
48+
AlVTMREwDwYDVQQIDAhOZXcgWW9yazEWMBQGA1UEBwwNTmV3IFlvcmsgQ2l0eTEQ
49+
MA4GA1UECgwHTW9uZ29EQjEPMA0GA1UECwwGS2VybmVsMSAwHgYDVQQDDBdTZXJ2
50+
ZXIgVmlhIEludGVybWVkaWF0ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
51+
ggEBAKCj95jJi63dCJDKyTWQAJwgLtvqwPmIvBMbYMcmrolP3tYolwkkh6c0RJdP
52+
UTy4gJaLZ9b9B8GuiGFatG+ZzEqCUh6AlG1lGJwdyqyP2eotpzkZJhwLGFc81DUt
53+
7WKhZjHikgXcAd3VMCXsjv7/axvBnc459SpsCW5heOiJ3Ap8OJIrTuD4GAWW5cfW
54+
GYa1v07hqXZ7SEloRE5Hm5bItnZA9+A5QNCj2a2PqK3TlrtCnDP125iYHc4W/+NO
55+
1V9LPKpDffdJ7slhrX69k9oV8HTQBgu7lRHKQlprW64pg6EMsw/5hpGjpZkyG9J9
56+
L1FYrXqsagA1E5j87JQH+SJDOEUCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAPRu7
57+
YtgaGPx4O2IfvYoK+BsiD/55WylDp/0zxf/xipvuoPRcMgX1ORoNuQTPfeIMxlZS
58+
UAIRHQSjOZQkH0WL2dglqaoBhTXO6c0PUuWOUsDDwnZE8lj26Jkka6PC8d8t7gjt
59+
w/k2IRnhcklKOu6pNlcYi+/WGcWphmkjMRWeka0vqXab/bxF1sdeHD9bMY59QOwI
60+
FT0JCG8Wn0LSi6V/Ip35JV3CryBP1Jual2aCXIXEKm3m+P4NboRQTZ7zqIcJoA8S
61+
i2GkuHCPOhhQP2isiRRBILujcJxnRYrR7qNIqvMrmPx3va8fMrHKtWAx+bfo/EIJ
62+
hlU1Eyls7Xv83x3vaA==
63+
-----END CERTIFICATE-----
64+
-----BEGIN PRIVATE KEY-----
65+
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCgo/eYyYut3QiQ
66+
ysk1kACcIC7b6sD5iLwTG2DHJq6JT97WKJcJJIenNESXT1E8uICWi2fW/QfBrohh
67+
WrRvmcxKglIegJRtZRicHcqsj9nqLac5GSYcCxhXPNQ1Le1ioWYx4pIF3AHd1TAl
68+
7I7+/2sbwZ3OOfUqbAluYXjoidwKfDiSK07g+BgFluXH1hmGtb9O4al2e0hJaERO
69+
R5uWyLZ2QPfgOUDQo9mtj6it05a7Qpwz9duYmB3OFv/jTtVfSzyqQ333Se7JYa1+
70+
vZPaFfB00AYLu5URykJaa1uuKYOhDLMP+YaRo6WZMhvSfS9RWK16rGoANROY/OyU
71+
B/kiQzhFAgMBAAECggEAYNydpj4ZADwgNxZfnvF2vK1XM/noZE6DgU3n3A3B/j/v
72+
0NhmwfeJ6FNG7KnCBUgHGT9z3Jlz/OBdkb5cwFJPcboFBClp1lC4NyJrnAOdVWwz
73+
weUdKpmyEqA2IN7RncBOW9QPUoMniPhMcQGj87RVhEYJ/ljKMMs2IJ2bhzPhP1xV
74+
MK/NJ6cT680MwZTzWWIPYT30Pv6IDm5INjb+AG4PuzDXTx28GsCw2z9RnlH8aSdu
75+
9qSNEoh4oXef4ny2niKa+fwRgTrkUYyljML34301dx6MclsMz0k9SprGrB2dPAxg
76+
IV3pRO3rqS6oEZKjyyXHPV45Q/AAm3tsP5aZCJm9fQKBgQDO6Qj5UpJT1PZcpTLW
77+
UY1l9N9GWDlRCCpprQYKwOWK6H9Pb5ptBYzGrIjC9YmX9hYjL7wOiznSsCO4zv8d
78+
1AR56A3APzD2iQQTyRkY9lr0CbtOSeYyg6MHQOVY8T8E/gw5M6SakLeB9ZwOLjxl
79+
fwu7gKAYmZi+h11R7f5EP3HZdwKBgQDGwK0RAC+fxtGFOY9CGqwG5rom3VPvpKd9
80+
gjlekXbGguA2Z21y6IdMjpTcrbnCX3DRNedpq1LH0r4xW2zrjV4P7g3j7qeSQwqW
81+
exHLvcfEkUAjPpaE64sC3qYgwJSwNdVWG+ikBmvT4oobFsOZzL6563Md54Tlo+bN
82+
MQ4dPhCrIwKBgFR4OGyotAo7X9RUsNtj8cjU3i32qHeXUNFRjKzpMQyze/3u/ulR
83+
IbaeCzskSGbcVQ9KVojNd+62b+7ruqTvwGAQR0Tbx15uc1ase22AbYNBUdFVRAAN
84+
U4oLiVX1LxgXqt/TYHilafVJUstLPubkpeKHUVSZqAzocEWZVnuANzdjAoGAFvUW
85+
iIou9hOvC+Z0J7yQ9lMcWXTjRyELv7GVEtlWkON5Jo+X0tgNGMi3ZS4j8NG5ZFEH
86+
o+sIKtCq62SWFjdEEC79J8DfVkOsK2mXyqLnOktUzz1hgYT7j59MLShRhHETbVjX
87+
7GpZdiYKscpVWaSOu0b5CxE9BpGCDV2HNdV/c2UCgYEArnS54agkV1qQ6AbMHdkD
88+
qAiDqOosDDzxgnEz422r5S9CGZ4n8uu9PGhb8NtlLxxxfKnArFGOiHmV0aPULUNp
89+
tX+vq4JC+1gyStUdwYkrhN48eG1KUFiAqcfEFxBgvdtpKxeOd+O5SKD/ceqJO7+3
90+
Z826BiCbw4nJAFNHmbNr6iw=
91+
-----END PRIVATE KEY-----

mongo/options/testdata/empty-ca.pem

Whitespace-only changes.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
totally valid CA certificate

0 commit comments

Comments
 (0)