Skip to content

Commit 12e5609

Browse files
committed
tlsconfig tests now use pre-generated keys and certificates
Signed-off-by: Arash Deshmeh <[email protected]>
1 parent 1b14b2d commit 12e5609

File tree

4 files changed

+106
-153
lines changed

4 files changed

+106
-153
lines changed

tlsconfig/config_test.go

Lines changed: 33 additions & 153 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,18 @@ package tlsconfig
22

33
import (
44
"bytes"
5-
"crypto"
6-
"crypto/ecdsa"
7-
"crypto/elliptic"
8-
"crypto/rand"
9-
"crypto/rsa"
105
"crypto/tls"
116
"crypto/x509"
12-
"crypto/x509/pkix"
137
"encoding/pem"
14-
"io"
158
"io/ioutil"
16-
"math/big"
179
"os"
18-
"path/filepath"
1910
"reflect"
2011
"testing"
21-
"time"
2212
)
2313

2414
// This is the currently active LetsEncrypt IdenTrust cross-signed CA cert. It expires Mar 17, 2021.
25-
const systemRootTrustedCert = `
15+
const (
16+
systemRootTrustedCert = `
2617
-----BEGIN CERTIFICATE-----
2718
MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/
2819
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
@@ -51,108 +42,27 @@ PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6
5142
KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==
5243
-----END CERTIFICATE-----
5344
`
45+
rsaPrivateKeyFile = "fixtures/key.pem"
46+
certificateFile = "fixtures/cert.pem"
47+
multiCertificateFile = "fixtures/multi.pem"
48+
)
5449

55-
var certTemplate = x509.Certificate{
56-
SerialNumber: big.NewInt(199999),
57-
Subject: pkix.Name{
58-
CommonName: "test",
59-
},
60-
NotBefore: time.Now().AddDate(-1, 1, 1),
61-
NotAfter: time.Now().AddDate(1, 1, 1),
62-
63-
KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
64-
ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageCodeSigning, x509.ExtKeyUsageAny},
65-
66-
BasicConstraintsValid: true,
67-
}
68-
69-
func generateCertificate(t *testing.T, signer crypto.Signer, out io.Writer, isCA bool) {
70-
template := certTemplate
71-
template.IsCA = isCA
72-
if isCA {
73-
template.KeyUsage = template.KeyUsage | x509.KeyUsageCertSign
74-
template.MaxPathLen = 1
75-
}
76-
derBytes, err := x509.CreateCertificate(rand.Reader, &template, &certTemplate, signer.Public(), signer)
77-
if err != nil {
78-
t.Fatal("Unable to generate a certificate", err.Error())
79-
}
80-
81-
if err = pem.Encode(out, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes}); err != nil {
82-
t.Fatal("Unable to write cert to file", err.Error())
83-
}
84-
}
85-
86-
// generates a multiple-certificate CA file with both RSA and ECDSA certs and
87-
// returns the filename so that cleanup can be deferred.
88-
func generateMultiCert(t *testing.T, tempDir string) string {
89-
certOut, err := os.Create(filepath.Join(tempDir, "multi"))
90-
if err != nil {
91-
t.Fatal("Unable to create file to write multi-cert to", err.Error())
92-
}
93-
defer certOut.Close()
94-
95-
rsaKey, err := rsa.GenerateKey(rand.Reader, 2048)
96-
if err != nil {
97-
t.Fatal("Unable to generate RSA key for multi-cert", err.Error())
98-
}
99-
ecKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
100-
if err != nil {
101-
t.Fatal("Unable to generate ECDSA key for multi-cert", err.Error())
102-
}
103-
104-
for _, signer := range []crypto.Signer{rsaKey, ecKey} {
105-
generateCertificate(t, signer, certOut, true)
106-
}
107-
108-
return certOut.Name()
109-
}
110-
111-
func generateCertAndKey(t *testing.T, tempDir string) (string, string) {
112-
rsaKey, err := rsa.GenerateKey(rand.Reader, 2048)
113-
if err != nil {
114-
t.Fatal("Unable to generate RSA key", err.Error())
115-
116-
}
117-
keyBytes := x509.MarshalPKCS1PrivateKey(rsaKey)
118-
119-
keyOut, err := os.Create(filepath.Join(tempDir, "key"))
120-
if err != nil {
121-
t.Fatal("Unable to create file to write key to", err.Error())
122-
123-
}
124-
defer keyOut.Close()
125-
126-
if err = pem.Encode(keyOut, &pem.Block{Type: "RSA PRIVATE KEY", Bytes: keyBytes}); err != nil {
127-
t.Fatal("Unable to write key to file", err.Error())
128-
}
129-
130-
certOut, err := os.Create(filepath.Join(tempDir, "cert"))
131-
if err != nil {
132-
t.Fatal("Unable to create file to write cert to", err.Error())
133-
}
134-
defer certOut.Close()
135-
136-
generateCertificate(t, rsaKey, certOut, false)
137-
138-
return keyOut.Name(), certOut.Name()
50+
// returns the name of a pre-generated, multiple-certificate CA file
51+
// with both RSA and ECDSA certs.
52+
func getMultiCert() string {
53+
return multiCertificateFile
13954
}
14055

141-
func makeTempDir(t *testing.T) string {
142-
tempDir, err := ioutil.TempDir("", "tlsconfig-test")
143-
if err != nil {
144-
t.Fatal("Could not make a temporary directory", err.Error())
145-
}
146-
return tempDir
56+
// returns the names of pre-generated key and certificate files.
57+
func getCertAndKey() (string, string) {
58+
return rsaPrivateKeyFile, certificateFile
14759
}
14860

14961
// If the cert files and directory are provided but are invalid, an error is
15062
// returned.
15163
func TestConfigServerTLSFailsIfUnableToLoadCerts(t *testing.T) {
152-
tempDir := makeTempDir(t)
153-
defer os.RemoveAll(tempDir)
154-
key, cert := generateCertAndKey(t, tempDir)
155-
ca := generateMultiCert(t, tempDir)
64+
key, cert := getCertAndKey()
65+
ca := getMultiCert()
15666

15767
tempFile, err := ioutil.TempFile("", "cert-test")
15868
if err != nil {
@@ -182,9 +92,7 @@ func TestConfigServerTLSFailsIfUnableToLoadCerts(t *testing.T) {
18292
// If server cert and key are provided and client auth and client CA are not
18393
// set, a tls config with only the server certs will be returned.
18494
func TestConfigServerTLSServerCertsOnly(t *testing.T) {
185-
tempDir := makeTempDir(t)
186-
defer os.RemoveAll(tempDir)
187-
key, cert := generateCertAndKey(t, tempDir)
95+
key, cert := getCertAndKey()
18896

18997
keypair, err := tls.LoadX509KeyPair(cert, key)
19098
if err != nil {
@@ -225,10 +133,8 @@ func TestConfigServerTLSServerCertsOnly(t *testing.T) {
225133
// If client CA is provided, it will only be used if the client auth is >=
226134
// VerifyClientCertIfGiven
227135
func TestConfigServerTLSClientCANotSetIfClientAuthTooLow(t *testing.T) {
228-
tempDir := makeTempDir(t)
229-
defer os.RemoveAll(tempDir)
230-
key, cert := generateCertAndKey(t, tempDir)
231-
ca := generateMultiCert(t, tempDir)
136+
key, cert := getCertAndKey()
137+
ca := getMultiCert()
232138

233139
tlsConfig, err := Server(Options{
234140
CertFile: cert,
@@ -255,10 +161,8 @@ func TestConfigServerTLSClientCANotSetIfClientAuthTooLow(t *testing.T) {
255161
// If client CA is provided, it will only be used if the client auth is >=
256162
// VerifyClientCertIfGiven
257163
func TestConfigServerTLSClientCASet(t *testing.T) {
258-
tempDir := makeTempDir(t)
259-
defer os.RemoveAll(tempDir)
260-
key, cert := generateCertAndKey(t, tempDir)
261-
ca := generateMultiCert(t, tempDir)
164+
key, cert := getCertAndKey()
165+
ca := getMultiCert()
262166

263167
tlsConfig, err := Server(Options{
264168
CertFile: cert,
@@ -290,10 +194,8 @@ func TestConfigServerTLSClientCASet(t *testing.T) {
290194
// Exclusive root pools determines whether the CA pool will be a union of the system
291195
// certificate pool and custom certs, or an exclusive or of the custom certs and system pool
292196
func TestConfigServerExclusiveRootPools(t *testing.T) {
293-
tempDir := makeTempDir(t)
294-
defer os.RemoveAll(tempDir)
295-
key, cert := generateCertAndKey(t, tempDir)
296-
ca := generateMultiCert(t, tempDir)
197+
key, cert := getCertAndKey()
198+
ca := getMultiCert()
297199

298200
caBytes, err := ioutil.ReadFile(ca)
299201
if err != nil {
@@ -384,9 +286,7 @@ func TestConfigServerTLSMinVersionIsSetBasedOnOptions(t *testing.T) {
384286
tls.VersionTLS11,
385287
tls.VersionTLS12,
386288
}
387-
tempDir := makeTempDir(t)
388-
defer os.RemoveAll(tempDir)
389-
key, cert := generateCertAndKey(t, tempDir)
289+
key, cert := getCertAndKey()
390290

391291
for _, v := range versions {
392292
tlsConfig, err := Server(Options{
@@ -408,9 +308,7 @@ func TestConfigServerTLSMinVersionIsSetBasedOnOptions(t *testing.T) {
408308
// An error should be returned if the specified minimum version for the server
409309
// is too low, i.e. less than VersionTLS10
410310
func TestConfigServerTLSMinVersionNotSetIfMinVersionIsTooLow(t *testing.T) {
411-
tempDir := makeTempDir(t)
412-
defer os.RemoveAll(tempDir)
413-
key, cert := generateCertAndKey(t, tempDir)
311+
key, cert := getCertAndKey()
414312

415313
_, err := Server(Options{
416314
MinVersion: tls.VersionSSL30,
@@ -426,9 +324,7 @@ func TestConfigServerTLSMinVersionNotSetIfMinVersionIsTooLow(t *testing.T) {
426324
// An error should be returned if an invalid minimum version for the server is
427325
// in the options struct
428326
func TestConfigServerTLSMinVersionNotSetIfMinVersionIsInvalid(t *testing.T) {
429-
tempDir := makeTempDir(t)
430-
defer os.RemoveAll(tempDir)
431-
key, cert := generateCertAndKey(t, tempDir)
327+
key, cert := getCertAndKey()
432328

433329
_, err := Server(Options{
434330
MinVersion: 1,
@@ -444,9 +340,7 @@ func TestConfigServerTLSMinVersionNotSetIfMinVersionIsInvalid(t *testing.T) {
444340
// The root CA is never set if InsecureSkipBoolean is set to true, but the
445341
// default client options are set
446342
func TestConfigClientTLSNoVerify(t *testing.T) {
447-
tempDir := makeTempDir(t)
448-
defer os.RemoveAll(tempDir)
449-
ca := generateMultiCert(t, tempDir)
343+
ca := getMultiCert()
450344

451345
tlsConfig, err := Client(Options{CAFile: ca, InsecureSkipVerify: true})
452346

@@ -497,9 +391,7 @@ func TestConfigClientTLSNoRoot(t *testing.T) {
497391

498392
// The RootCA is set if the file is provided and InsecureSkipVerify is false
499393
func TestConfigClientTLSRootCAFileWithOneCert(t *testing.T) {
500-
tempDir := makeTempDir(t)
501-
defer os.RemoveAll(tempDir)
502-
ca := generateMultiCert(t, tempDir)
394+
ca := getMultiCert()
503395

504396
tlsConfig, err := Client(Options{CAFile: ca})
505397

@@ -531,9 +423,7 @@ func TestConfigClientTLSNonexistentRootCAFile(t *testing.T) {
531423
// An error is returned if either the client cert or the key are provided
532424
// but invalid or blank.
533425
func TestConfigClientTLSClientCertOrKeyInvalid(t *testing.T) {
534-
tempDir := makeTempDir(t)
535-
defer os.RemoveAll(tempDir)
536-
key, cert := generateCertAndKey(t, tempDir)
426+
key, cert := getCertAndKey()
537427

538428
tempFile, err := ioutil.TempFile("", "cert-test")
539429
if err != nil {
@@ -558,9 +448,7 @@ func TestConfigClientTLSClientCertOrKeyInvalid(t *testing.T) {
558448
// The certificate is set if the client cert and client key are provided and
559449
// valid.
560450
func TestConfigClientTLSValidClientCertAndKey(t *testing.T) {
561-
tempDir := makeTempDir(t)
562-
defer os.RemoveAll(tempDir)
563-
key, cert := generateCertAndKey(t, tempDir)
451+
key, cert := getCertAndKey()
564452

565453
keypair, err := tls.LoadX509KeyPair(cert, key)
566454
if err != nil {
@@ -593,9 +481,7 @@ func TestConfigClientTLSValidClientCertAndKey(t *testing.T) {
593481
// Exclusive root pools determines whether the CA pool will be a union of the system
594482
// certificate pool and custom certs, or an exclusive or of the custom certs and system pool
595483
func TestConfigClientExclusiveRootPools(t *testing.T) {
596-
tempDir := makeTempDir(t)
597-
defer os.RemoveAll(tempDir)
598-
ca := generateMultiCert(t, tempDir)
484+
ca := getMultiCert()
599485

600486
caBytes, err := ioutil.ReadFile(ca)
601487
if err != nil {
@@ -671,9 +557,7 @@ func TestConfigClientExclusiveRootPools(t *testing.T) {
671557
// If a valid MinVersion is specified in the options, the client's
672558
// minimum version should be set accordingly
673559
func TestConfigClientTLSMinVersionIsSetBasedOnOptions(t *testing.T) {
674-
tempDir := makeTempDir(t)
675-
defer os.RemoveAll(tempDir)
676-
key, cert := generateCertAndKey(t, tempDir)
560+
key, cert := getCertAndKey()
677561

678562
tlsConfig, err := Client(Options{
679563
MinVersion: tls.VersionTLS12,
@@ -693,9 +577,7 @@ func TestConfigClientTLSMinVersionIsSetBasedOnOptions(t *testing.T) {
693577
// An error should be returned if the specified minimum version for the client
694578
// is too low, i.e. less than VersionTLS12
695579
func TestConfigClientTLSMinVersionNotSetIfMinVersionIsTooLow(t *testing.T) {
696-
tempDir := makeTempDir(t)
697-
defer os.RemoveAll(tempDir)
698-
key, cert := generateCertAndKey(t, tempDir)
580+
key, cert := getCertAndKey()
699581

700582
_, err := Client(Options{
701583
MinVersion: tls.VersionTLS11,
@@ -711,9 +593,7 @@ func TestConfigClientTLSMinVersionNotSetIfMinVersionIsTooLow(t *testing.T) {
711593
// An error should be returned if an invalid minimum version for the client is
712594
// in the options struct
713595
func TestConfigClientTLSMinVersionNotSetIfMinVersionIsInvalid(t *testing.T) {
714-
tempDir := makeTempDir(t)
715-
defer os.RemoveAll(tempDir)
716-
key, cert := generateCertAndKey(t, tempDir)
596+
key, cert := getCertAndKey()
717597

718598
_, err := Client(Options{
719599
MinVersion: 1,

tlsconfig/fixtures/cert.pem

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIC1jCCAb6gAwIBAgIDAw0/MA0GCSqGSIb3DQEBCwUAMA8xDTALBgNVBAMTBHRl
3+
c3QwHhcNMTYwMzI4MTg0MTQ3WhcNMjcwMzI4MTg0MTQ3WjAPMQ0wCwYDVQQDEwR0
4+
ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1k1NO4wzCpxZ71Bo
5+
SiYSWh8SE9jHtg6lz0QjMQXzFuLhpedjHJYx9fYbD+JVk5vnRbUqNUeZVKAGahfR
6+
9vhm5I+cm359gYU0gHawLw91oh4JCiwUu77U2obHvtvcXLf6Fb/+MoSA5wH7vbL3
7+
T4vR1+hLt+R+kILAEHq/IlSdLD8CA0iA+ypHfCPOi5F2wVjAyMnQXgVDkAhzefpu
8+
JkhN1yUgb5WK4qoSuOUDUYq/bRosLdHXDJiWRuqaU2zxO5cHVlrNAE5RuspfEzl4
9+
YP6boZTOomLEDbBTSJWgX2/ybvY7o4sCw7KrvyBIqSK9HbfaK1nFMFGoiSH6+1m4
10+
amWKrwIDAQABozswOTAOBgNVHQ8BAf8EBAMCBaAwGQYDVR0lBBIwEAYIKwYBBQUH
11+
AwMGBFUdJQAwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAQEADuXjLtGk
12+
tU5ql+LFB32Cc2Laa0iO8aqJccOcXYKg4FD0um+1+YQO1CBZZqWjItH4CuJl5+2j
13+
Tc9sFgrIVH5CmvUkOUFPCNDAJtxBvF6RQqRpehjheHDaNsYo9JNKHKEJB6OJrDgy
14+
N5krM5FKyAp/EDTbIrGIZFMdxQGxK5MfpfPkKK44JgOQM3QWeR+LqIpfd34MD1jZ
15+
jjYdl0+quIHiIdFR0a4Uam7o9GfUmcWe1VFthLb5pNhV6t+wyuLyMXVMNacKZSz/
16+
nOMWVQfgViZk6rHOPSMrFMc7Pp488I907MJKCryd21LcLqMuhb4BpWcJghnY8Lbs
17+
uIPLsUHr3Pfp9Q==
18+
-----END CERTIFICATE-----

tlsconfig/fixtures/key.pem

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIIEpQIBAAKCAQEA1k1NO4wzCpxZ71BoSiYSWh8SE9jHtg6lz0QjMQXzFuLhpedj
3+
HJYx9fYbD+JVk5vnRbUqNUeZVKAGahfR9vhm5I+cm359gYU0gHawLw91oh4JCiwU
4+
u77U2obHvtvcXLf6Fb/+MoSA5wH7vbL3T4vR1+hLt+R+kILAEHq/IlSdLD8CA0iA
5+
+ypHfCPOi5F2wVjAyMnQXgVDkAhzefpuJkhN1yUgb5WK4qoSuOUDUYq/bRosLdHX
6+
DJiWRuqaU2zxO5cHVlrNAE5RuspfEzl4YP6boZTOomLEDbBTSJWgX2/ybvY7o4sC
7+
w7KrvyBIqSK9HbfaK1nFMFGoiSH6+1m4amWKrwIDAQABAoIBAQC802wj9grbZJzS
8+
A1WBUD6Hbi0tk6uVPR7YnD8t6QIivlL5LgLko2ruQKXjvxiMcai8gT7pp2bxa/d6
9+
7/Yv2PxAlFH3qOLJhyeVsf7X2JVb/X8VmXXDYAiJbI0AHRX0FJ+lHoDK3nn+En9Q
10+
zSqgyqBhz+s343uptauqWZ2kkE3VNyqlPBhmKc5NcbR7Sgb4nJ3CkNAcxRkl1NeI
11+
BRFdsTUYRNR3Vd++OvOzI4uzZfCIeUVqx+r7/SeLW0UwqeprMm7g+hFQLfH+e9SA
12+
9lx0EIRoQFwgvKju2eogpSwvkSlObXnESu5OHYtnc+jpsOC0EbQgO0d6CqVZiqjR
13+
2dRYsZkhAoGBAO69loXSAsyqUj0rT5iq59PuMlBEAlW6hQTfl6c8bnu1JUo2s/CH
14+
OJfswxfHN32qmi99WbK2iLyrnznNYsyPnYKW0ObwuoqAdrlydfu7Fq9HSOACoIvK
15+
jRMOsiJtM3JX2bHHV7yIwJ1+h++o2Ly803j7tKtYsrRQVZiWeTcR2IRZAoGBAOXL
16+
bJFLbAhm3zRqhbiWuORqqyLxrDmIB6RY8vTdX47vwzkFGZJlCuL+vs6877I6eOc9
17+
wjH9qcOiJQJ4DWkAE+VS5PAPoj0UDRw7AkE9v3RwnmxvAfP5rPo5KimYxKq4yX6r
18+
+Qc4ixwftCj0rxFoG4lnipwBFq4NXuHtIhbZXMZHAoGBAOGfatGtV9f0XyRP+jld
19+
yxoO0p3oqAw86dlhNgFmq0NePo+UgxmdsW5i4z1lmJu6z1xyKoMq3q7vwtrtr6GD
20+
WGhB/8tBVgnuvkUkVzw/44Bi7gxGb1OtaQXJra+7ZBN70tCgg9o5o080dWOZPruf
21+
+Hst5eDJQpoGEd7S1lulEeqBAoGBAKAqdIak6izE/wg6wu+Q5lgW3SejCOakoKb1
22+
dIoljkhDZ2/j1RoLoVXsNzRDzlIMnV6X1jYf1ubLqj4ZTUeFTVjGuVl1nCA0TJsD
23+
qiOtFTfkkxeDG/pgaSeTFocdut4/o/nNhep5h8RXeKwfN7LLPH4+FAd+Xr98BEk2
24+
jk8cu6RbAoGAHI9yRXKjlADBZLvxxMGHRfe7eK4PgABmluZLdsXzNmXxybrZDvdC
25+
teipvIUSym7tvdDB6LHXKVp4mYeqHe/ktRatlhbQyPso2VPoMFQyuRBYKKFFAh0V
26+
3d6EyTRnIxn/NW+XdcCUeufFfd+3BHyux68PyUsTtKRCJYfhExzJf70=
27+
-----END RSA PRIVATE KEY-----

tlsconfig/fixtures/multi.pem

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIC3DCCAcSgAwIBAgIDAw0/MA0GCSqGSIb3DQEBCwUAMA8xDTALBgNVBAMTBHRl
3+
c3QwHhcNMTYwMzI4MTg0MTQ3WhcNMjcwMzI4MTg0MTQ3WjAPMQ0wCwYDVQQDEwR0
4+
ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArVIJDnNnM1iX7Xj8
5+
bja4WsgHuENRBsBCROTDjQL1w7Ksin2jmCl/D7Gk9ifRJZ/HPE3BKo6B+3CDXygJ
6+
Qvoe8SGWi6ae8lN4VgPoW7xDViAWhVmjIr+dNQXWD0hCq0YZuXyYSi5iXWeRaTvx
7+
2eoG2VSkNnkc/0weEhX1nBGBscuz1UZqWp53m09eL7otngcNcdjmvLPiw4E3cric
8+
UoLVonzf4ZE84Q7nNmfWfMKh4zJUyn8N766GAAoC6RAKsJ0xSDeRjkzSy7vGJKBv
9+
nTBe6X1xyFZaN0mAjtRkYaxI9ZfI8K41Trhd88s4B4G61p70DY3dMLmuF8wGHVCF
10+
lMMV6wIDAQABo0EwPzAOBgNVHQ8BAf8EBAMCAqQwGQYDVR0lBBIwEAYIKwYBBQUH
11+
AwMGBFUdJQAwEgYDVR0TAQH/BAgwBgEB/wIBATANBgkqhkiG9w0BAQsFAAOCAQEA
12+
LriCH0FTaOFIBl+kxAKjs7puhIZoYLwQ8IReXdEU7kYjPff3X/eiO82A0GwMM9Fp
13+
/RdMlZGDSLyZ1a/gKCz55j9J4MW8ZH7RSEQs3dJQCvEPDO6UdgKy4Ft9yNh/ba1J
14+
8/n0CqR+0QNov6Qp7eMDkQaDvKgCaABn8at6VLtuifJXFKDGt0LrR7wkQBJ85SZB
15+
9GdfNSPzEZkb4FQ2gPgAk7ySoQ6Hi6mogEORbtJ7+Xiq57J+cEZQV6TOuwYgBG4e
16+
MW3h37+7V5a/absybik1F/gcx4IbEBd/7an6a+a2l5FeTED5kpzvD4+yrQAoY8lT
17+
gccRdP0O4CsLn7zlLRidPQ==
18+
-----END CERTIFICATE-----
19+
-----BEGIN CERTIFICATE-----
20+
MIIBTzCB9qADAgECAgMDDT8wCgYIKoZIzj0EAwIwDzENMAsGA1UEAxMEdGVzdDAe
21+
Fw0xNjAzMjgxODQxNDdaFw0yNzAzMjgxODQxNDdaMA8xDTALBgNVBAMTBHRlc3Qw
22+
WTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQy8xfFkSiJA10EC1MMJzkLgu6csocC
23+
UNyix7zOqijLsASE4an5LQsZ1PuhgVYnL+B9rAcnXgJaLM8YOmLRPqNdo0EwPzAO
24+
BgNVHQ8BAf8EBAMCAqQwGQYDVR0lBBIwEAYIKwYBBQUHAwMGBFUdJQAwEgYDVR0T
25+
AQH/BAgwBgEB/wIBATAKBggqhkjOPQQDAgNIADBFAiEAwUrZY7fHwr4FWONiBJo6
26+
97V9GAbj70ZJqV5M7rt+hMECIFY66kUrv0sG2vlhicSIGwSOdB3VcijdZSelzLn1
27+
iRk5
28+
-----END CERTIFICATE-----

0 commit comments

Comments
 (0)