Skip to content

Commit 739d7c2

Browse files
committed
Add additional tests for common GRPCServer
This changeset adds a couple of new tests for TLS using certficates signed by both root and intermediate certificate authorities. It also populates the testdata/certs directory with certificates which will be used in the next phases of the implmentation and adds a generator utility for these certificates *updated patch set corrects error in certificate generation and cleans up unneeded certificates in the testdata/certs directory *latest update removes specific check for "host not found" and simply checks for error as some systems resolve all DNS names to a remote address Enhances FAB-1259 Change-Id: Ic519b1d8c607c56db4644a3cae60e082743b4ac7 Signed-off-by: Gari Singh <[email protected]>
1 parent ec83773 commit 739d7c2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+935
-13
lines changed

core/comm/server_test.go

+168-13
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ package comm_test
1919
import (
2020
"crypto/tls"
2121
"crypto/x509"
22+
"io/ioutil"
2223
"net"
24+
"path/filepath"
2325
"testing"
2426
"time"
2527

@@ -61,7 +63,7 @@ zA85vv7JhfMkvZYGPELC7I2K8V7ZAiEA9KcthV3HtDXKNDsA6ULT+qUkyoHRzCzr
6163
A4QaL2VU6i4=
6264
-----END CERTIFICATE-----
6365
`
64-
var timeout = time.Second * 10
66+
var timeout = time.Second * 3
6567

6668
type testServiceServer struct{}
6769

@@ -133,12 +135,8 @@ func TestNewGRPCServerInvalidParameters(t *testing.T) {
133135

134136
//bad hostname
135137
_, err = comm.NewGRPCServer("hostdoesnotexist.localdomain:9050", nil, nil, nil, nil)
136-
//check for error
137-
msg = "no such host"
138-
if assert.Error(t, err, "%s error expected", msg) {
139-
assert.Contains(t, err.Error(), msg) //use contains here as error message inconsistent
140-
}
141-
138+
//check for error only - there are a few possibilities depending on DNS resolution but will get an error
139+
assert.Error(t, err, "%s error expected", msg)
142140
if err != nil {
143141
t.Log(err.Error())
144142
}
@@ -225,9 +223,8 @@ func TestNewGRPCServer(t *testing.T) {
225223
_, err = invokeEmptyCall(testAddress, dialOptions)
226224

227225
if err != nil {
228-
t.Logf("GRPC client failed to invoke the EmptyCall service on %s: %v",
226+
t.Fatalf("GRPC client failed to invoke the EmptyCall service on %s: %v",
229227
testAddress, err)
230-
t.Fatalf(err.Error())
231228
} else {
232229
t.Log("GRPC client successfully invoked the EmptyCall service: " + testAddress)
233230
}
@@ -277,9 +274,8 @@ func TestNewGRPCServerFromListener(t *testing.T) {
277274
_, err = invokeEmptyCall(testAddress, dialOptions)
278275

279276
if err != nil {
280-
t.Logf("GRPC client failed to invoke the EmptyCall service on %s: %v",
277+
t.Fatalf("GRPC client failed to invoke the EmptyCall service on %s: %v",
281278
testAddress, err)
282-
t.Fatalf(err.Error())
283279
} else {
284280
t.Log("GRPC client successfully invoked the EmptyCall service: " + testAddress)
285281
}
@@ -336,7 +332,7 @@ func TestNewSecureGRPCServer(t *testing.T) {
336332
_, err = invokeEmptyCall(testAddress, dialOptions)
337333

338334
if err != nil {
339-
t.Logf("GRPC client failed to invoke the EmptyCall service on %s: %v",
335+
t.Fatalf("GRPC client failed to invoke the EmptyCall service on %s: %v",
340336
testAddress, err)
341337
} else {
342338
t.Log("GRPC client successfully invoked the EmptyCall service: " + testAddress)
@@ -401,9 +397,168 @@ func TestNewSecureGRPCServerFromListener(t *testing.T) {
401397
_, err = invokeEmptyCall(testAddress, dialOptions)
402398

403399
if err != nil {
404-
t.Logf("GRPC client failed to invoke the EmptyCall service on %s: %v",
400+
t.Fatalf("GRPC client failed to invoke the EmptyCall service on %s: %v",
405401
testAddress, err)
406402
} else {
407403
t.Log("GRPC client successfully invoked the EmptyCall service: " + testAddress)
408404
}
409405
}
406+
407+
//prior tests used self-signed certficates loaded by the GRPCServer and the test client
408+
//here we'll use certificates signed by certificate authorities
409+
func TestWithSignedRootCertificates(t *testing.T) {
410+
411+
//use Org1 testdata
412+
fileBase := "Org1"
413+
certPEMBlock, err := ioutil.ReadFile(filepath.Join("testdata", "certs", fileBase+"-server1-cert.pem"))
414+
keyPEMBlock, err := ioutil.ReadFile(filepath.Join("testdata", "certs", fileBase+"-server1-key.pem"))
415+
caPEMBlock, err := ioutil.ReadFile(filepath.Join("testdata", "certs", fileBase+"-cert.pem"))
416+
417+
if err != nil {
418+
t.Fatalf("Failed to load test certificates: %v", err)
419+
}
420+
testAddress := "localhost:9057"
421+
//create our listener
422+
lis, err := net.Listen("tcp", testAddress)
423+
424+
if err != nil {
425+
t.Fatalf("Failed to create listener: %v", err)
426+
}
427+
428+
srv, err := comm.NewGRPCServerFromListener(lis, keyPEMBlock,
429+
certPEMBlock, nil, nil)
430+
//check for error
431+
if err != nil {
432+
t.Fatalf("Failed to return new GRPC server: %v", err)
433+
}
434+
435+
//register the GRPC test server
436+
testpb.RegisterTestServiceServer(srv.Server(), &testServiceServer{})
437+
438+
//start the server
439+
go srv.Start()
440+
441+
defer srv.Stop()
442+
//should not be needed
443+
time.Sleep(10 * time.Millisecond)
444+
445+
//create the client credentials
446+
certPoolServer := x509.NewCertPool()
447+
448+
//use the server certificate only
449+
if !certPoolServer.AppendCertsFromPEM(certPEMBlock) {
450+
t.Fatal("Failed to append certificate to client credentials")
451+
}
452+
453+
creds := credentials.NewClientTLSFromCert(certPoolServer, "")
454+
455+
//GRPC client options
456+
var dialOptions []grpc.DialOption
457+
dialOptions = append(dialOptions, grpc.WithTransportCredentials(creds))
458+
459+
//invoke the EmptyCall service
460+
_, err = invokeEmptyCall(testAddress, dialOptions)
461+
462+
//client should not be able to connect
463+
//for now we can only test that we get a timeout error
464+
assert.EqualError(t, err, grpc.ErrClientConnTimeout.Error())
465+
t.Logf("assert.EqualError: %s", err.Error())
466+
467+
//now use the CA certificate
468+
certPoolCA := x509.NewCertPool()
469+
if !certPoolCA.AppendCertsFromPEM(caPEMBlock) {
470+
t.Fatal("Failed to append certificate to client credentials")
471+
}
472+
creds = credentials.NewClientTLSFromCert(certPoolCA, "")
473+
var dialOptionsCA []grpc.DialOption
474+
dialOptionsCA = append(dialOptionsCA, grpc.WithTransportCredentials(creds))
475+
476+
//invoke the EmptyCall service
477+
_, err2 := invokeEmptyCall(testAddress, dialOptionsCA)
478+
479+
if err2 != nil {
480+
t.Fatalf("GRPC client failed to invoke the EmptyCall service on %s: %v",
481+
testAddress, err2)
482+
} else {
483+
t.Log("GRPC client successfully invoked the EmptyCall service: " + testAddress)
484+
}
485+
}
486+
487+
//here we'll use certificates signed by intermediate certificate authorities
488+
func TestWithSignedIntermediateCertificates(t *testing.T) {
489+
490+
//use Org1 testdata
491+
fileBase := "Org1"
492+
certPEMBlock, err := ioutil.ReadFile(filepath.Join("testdata", "certs", fileBase+"-child1-server1-cert.pem"))
493+
keyPEMBlock, err := ioutil.ReadFile(filepath.Join("testdata", "certs", fileBase+"-child1-server1-key.pem"))
494+
intermediatePEMBlock, err := ioutil.ReadFile(filepath.Join("testdata", "certs", fileBase+"-child1-cert.pem"))
495+
496+
if err != nil {
497+
t.Fatalf("Failed to load test certificates: %v", err)
498+
}
499+
testAddress := "localhost:9058"
500+
//create our listener
501+
lis, err := net.Listen("tcp", testAddress)
502+
503+
if err != nil {
504+
t.Fatalf("Failed to create listener: %v", err)
505+
}
506+
507+
srv, err := comm.NewGRPCServerFromListener(lis, keyPEMBlock,
508+
certPEMBlock, nil, nil)
509+
//check for error
510+
if err != nil {
511+
t.Fatalf("Failed to return new GRPC server: %v", err)
512+
}
513+
514+
//register the GRPC test server
515+
testpb.RegisterTestServiceServer(srv.Server(), &testServiceServer{})
516+
517+
//start the server
518+
go srv.Start()
519+
520+
defer srv.Stop()
521+
//should not be needed
522+
time.Sleep(10 * time.Millisecond)
523+
524+
//create the client credentials
525+
certPoolServer := x509.NewCertPool()
526+
527+
//use the server certificate only
528+
if !certPoolServer.AppendCertsFromPEM(certPEMBlock) {
529+
t.Fatal("Failed to append certificate to client credentials")
530+
}
531+
532+
creds := credentials.NewClientTLSFromCert(certPoolServer, "")
533+
534+
//GRPC client options
535+
var dialOptions []grpc.DialOption
536+
dialOptions = append(dialOptions, grpc.WithTransportCredentials(creds))
537+
538+
//invoke the EmptyCall service
539+
_, err = invokeEmptyCall(testAddress, dialOptions)
540+
541+
//client should not be able to connect
542+
//for now we can only test that we get a timeout error
543+
assert.EqualError(t, err, grpc.ErrClientConnTimeout.Error())
544+
t.Logf("assert.EqualError: %s", err.Error())
545+
546+
//now use the CA certificate
547+
certPoolCA := x509.NewCertPool()
548+
if !certPoolCA.AppendCertsFromPEM(intermediatePEMBlock) {
549+
t.Fatal("Failed to append certificate to client credentials")
550+
}
551+
creds = credentials.NewClientTLSFromCert(certPoolCA, "")
552+
var dialOptionsCA []grpc.DialOption
553+
dialOptionsCA = append(dialOptionsCA, grpc.WithTransportCredentials(creds))
554+
555+
//invoke the EmptyCall service
556+
_, err2 := invokeEmptyCall(testAddress, dialOptionsCA)
557+
558+
if err2 != nil {
559+
t.Fatalf("GRPC client failed to invoke the EmptyCall service on %s: %v",
560+
testAddress, err2)
561+
} else {
562+
t.Log("GRPC client successfully invoked the EmptyCall service: " + testAddress)
563+
}
564+
}
+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIB5zCCAYygAwIBAgIQBoqyusG6LOG7fdzjrfvW8DAKBggqhkjOPQQDAjBYMQsw
3+
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
4+
YW5jaXNjbzENMAsGA1UEChMET3JnMTENMAsGA1UEAxMET3JnMTAeFw0xNjEyMTkx
5+
MjE0NTRaFw0yNjEyMTcxMjE0NTRaMFgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpD
6+
YWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMQ0wCwYDVQQKEwRPcmcx
7+
MQ0wCwYDVQQDEwRPcmcxMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEgm/Cr5PM
8+
QasIdK2Ez8ghs43OjC9syqlJsZ3UCfvd671pDr2hZtbFsG1pHElUvcYjuXrh/Jso
9+
YItEXmAJ2jZZsKM4MDYwDgYDVR0PAQH/BAQDAgGmMBMGA1UdJQQMMAoGCCsGAQUF
10+
BwMBMA8GA1UdEwEB/wQFMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAIAMGQk4gvE+
11+
RlaxBVqsv6FarhtN9EfAMYu/gFrv3vUqAiEAu3MPm/0iZpa53N8PAhIKus6UIx4g
12+
nXzhP2sbDMVjccA=
13+
-----END CERTIFICATE-----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIB8zCCAZqgAwIBAgIQYKUEm2IXkwb7hhfmFKH0lTAKBggqhkjOPQQDAjBYMQsw
3+
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
4+
YW5jaXNjbzENMAsGA1UEChMET3JnMTENMAsGA1UEAxMET3JnMTAeFw0xNjEyMTkx
5+
MjE0NTRaFw0yNjEyMTcxMjE0NTRaMGYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpD
6+
YWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMRQwEgYDVQQKEwtPcmcx
7+
LWNoaWxkMTEUMBIGA1UEAxMLT3JnMS1jaGlsZDEwWTATBgcqhkjOPQIBBggqhkjO
8+
PQMBBwNCAAQd0zt95LaDV7TYJGpS9rCNeURgVJUJLtQZtgxAIP+k8je+1yXC1WqR
9+
qMKtBm3aQP04kcJd8xaXj5yl3p1/qk/bozgwNjAOBgNVHQ8BAf8EBAMCAaYwEwYD
10+
VR0lBAwwCgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAgNH
11+
ADBEAh9HoG8o8aljiYEal3PumepBWpbIcDv9Pc4oLmDgh6PNAiEAh9MT72bmCdrh
12+
qSSazVaZxgmrH7DyNn7Y5ij4XDRjhwQ=
13+
-----END CERTIFICATE-----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIICBDCCAaugAwIBAgIQXS8mfkPPbSh05Kbty0/mwjAKBggqhkjOPQQDAjBmMQsw
3+
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
4+
YW5jaXNjbzEUMBIGA1UEChMLT3JnMS1jaGlsZDExFDASBgNVBAMTC09yZzEtY2hp
5+
bGQxMB4XDTE2MTIxOTEyMTQ1NFoXDTI2MTIxNzEyMTQ1NFowbDELMAkGA1UEBhMC
6+
VVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28x
7+
HDAaBgNVBAoTE09yZzEtY2hpbGQxLWNsaWVudDExEjAQBgNVBAMTCWxvY2FsaG9z
8+
dDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOLHdFSFvnTbYcLr63Wi/wjdBaVo
9+
6Vo7y1zSyxSZ1G7kI2cfg+lDfdzUD1WM4SUZV1pIlYS6MpokZn9Dyd7SfM+jNTAz
10+
MA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8E
11+
AjAAMAoGCCqGSM49BAMCA0cAMEQCICk/fL44adOAlXJxvuql5+3xx7bGzgCIfoVz
12+
sAqDScfsAiAH4C/z+jCKK4WpywxlE/U3wz0FwZwGGXDON4AXVg3Mow==
13+
-----END CERTIFICATE-----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-----BEGIN EC PRIVATE KEY-----
2+
MHcCAQEEIJOlMLzN+kRVbnCTDeIeO5VmYVr4ILNr7MqD7a72HaLFoAoGCCqGSM49
3+
AwEHoUQDQgAE4sd0VIW+dNthwuvrdaL/CN0FpWjpWjvLXNLLFJnUbuQjZx+D6UN9
4+
3NQPVYzhJRlXWkiVhLoymiRmf0PJ3tJ8zw==
5+
-----END EC PRIVATE KEY-----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-----BEGIN EC PRIVATE KEY-----
2+
MHcCAQEEIANJY6KInPgTmezBBoE/Vq0g6y/FwoBo54rbJjmXnedhoAoGCCqGSM49
3+
AwEHoUQDQgAEHdM7feS2g1e02CRqUvawjXlEYFSVCS7UGbYMQCD/pPI3vtclwtVq
4+
kajCrQZt2kD9OJHCXfMWl4+cpd6df6pP2w==
5+
-----END EC PRIVATE KEY-----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIICBTCCAaugAwIBAgIQGJLwRu+fdXkVBXqn4Q/D9TAKBggqhkjOPQQDAjBmMQsw
3+
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
4+
YW5jaXNjbzEUMBIGA1UEChMLT3JnMS1jaGlsZDExFDASBgNVBAMTC09yZzEtY2hp
5+
bGQxMB4XDTE2MTIxOTEyMTQ1NFoXDTI2MTIxNzEyMTQ1NFowbDELMAkGA1UEBhMC
6+
VVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28x
7+
HDAaBgNVBAoTE09yZzEtY2hpbGQxLXNlcnZlcjExEjAQBgNVBAMTCWxvY2FsaG9z
8+
dDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABPPWSE1Hwcb6/gkkLUQTiGqJbaEc
9+
fXc6ua+gZabJtEZgoO+RjTDq8X1OVFKJYnVUsqdYoA4ymclbZh1p90fGB/+jNTAz
10+
MA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8E
11+
AjAAMAoGCCqGSM49BAMCA0gAMEUCIGhtRzuHGz8e/I/Wkv8fSzVeRUyiRrdp33MW
12+
APfmqW+uAiEAzToTwUh4qXosee/gh3zG2kfiEgrSa4nfMz0T9dBfF68=
13+
-----END CERTIFICATE-----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-----BEGIN EC PRIVATE KEY-----
2+
MHcCAQEEIFq1dZOPEkCC5VuAdtB0vb9Ncz1zIfBPTe9eCN9rfkWloAoGCCqGSM49
3+
AwEHoUQDQgAE89ZITUfBxvr+CSQtRBOIaoltoRx9dzq5r6Blpsm0RmCg75GNMOrx
4+
fU5UUolidVSyp1igDjKZyVtmHWn3R8YH/w==
5+
-----END EC PRIVATE KEY-----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIICBzCCAaygAwIBAgIRAO+oRnnA09sDNeNBFP4J/mcwCgYIKoZIzj0EAwIwZjEL
3+
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
4+
cmFuY2lzY28xFDASBgNVBAoTC09yZzEtY2hpbGQxMRQwEgYDVQQDEwtPcmcxLWNo
5+
aWxkMTAeFw0xNjEyMTkxMjE0NTRaFw0yNjEyMTcxMjE0NTRaMGwxCzAJBgNVBAYT
6+
AlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2Nv
7+
MRwwGgYDVQQKExNPcmcxLWNoaWxkMS1zZXJ2ZXIyMRIwEAYDVQQDEwlsb2NhbGhv
8+
c3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS8+DMyiKGF+MmGOUDR5Ba0DdEs
9+
Ea8r5wc3Qwt+kbE5rh0J+pMV+ZB1nvuGk/P7wUSMMyCae1Z9TwmGVQyhfNw4ozUw
10+
MzAOBgNVHQ8BAf8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/
11+
BAIwADAKBggqhkjOPQQDAgNJADBGAiEAvnm6cyeF3YKA/WiQdsP8iASlNkFMnuek
12+
jZdLCgDs4XICIQDzn9j9S4aJvZwKQ96d3dIpJ/8910w6VF6apgpJ6WnYBQ==
13+
-----END CERTIFICATE-----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-----BEGIN EC PRIVATE KEY-----
2+
MHcCAQEEIG9/X7NuNj1A9WGsTVzDUBE5hp1hN4q/EAOEjjO3oYKEoAoGCCqGSM49
3+
AwEHoUQDQgAEvPgzMoihhfjJhjlA0eQWtA3RLBGvK+cHN0MLfpGxOa4dCfqTFfmQ
4+
dZ77hpPz+8FEjDMgmntWfU8JhlUMoXzcOA==
5+
-----END EC PRIVATE KEY-----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIB8zCCAZqgAwIBAgIQO2kTviFxObnIfvpvm5INczAKBggqhkjOPQQDAjBYMQsw
3+
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
4+
YW5jaXNjbzENMAsGA1UEChMET3JnMTENMAsGA1UEAxMET3JnMTAeFw0xNjEyMTkx
5+
MjE0NTRaFw0yNjEyMTcxMjE0NTRaMGYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpD
6+
YWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMRQwEgYDVQQKEwtPcmcx
7+
LWNoaWxkMjEUMBIGA1UEAxMLT3JnMS1jaGlsZDIwWTATBgcqhkjOPQIBBggqhkjO
8+
PQMBBwNCAATT8hJlwkqlhum6LXTyUENBmuvG1D47Yaoo7xolqB4rgaQ66twGXIbm
9+
/kBd++4glU0tdHFxiNEx+NFGBjRydbGgozgwNjAOBgNVHQ8BAf8EBAMCAaYwEwYD
10+
VR0lBAwwCgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAgNH
11+
ADBEAiBqdAbBd0Iy4iEiPegzzJFDDCO/p0O/4kPq0W/TCC4QbQIgSCNE54c6WuB3
12+
s1015/Hh5OfZVYfwNdtdUnLDqWaRqZc=
13+
-----END CERTIFICATE-----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIICBjCCAaygAwIBAgIRAPjPkGnHmU7cf0H+Tl9LuNQwCgYIKoZIzj0EAwIwZjEL
3+
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
4+
cmFuY2lzY28xFDASBgNVBAoTC09yZzEtY2hpbGQyMRQwEgYDVQQDEwtPcmcxLWNo
5+
aWxkMjAeFw0xNjEyMTkxMjE0NTRaFw0yNjEyMTcxMjE0NTRaMGwxCzAJBgNVBAYT
6+
AlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2Nv
7+
MRwwGgYDVQQKExNPcmcxLWNoaWxkMi1jbGllbnQxMRIwEAYDVQQDEwlsb2NhbGhv
8+
c3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATPYg/tCw3jPT7wEaxNAaae52Ix
9+
qyew7c5np0fOD+phVSC4Pd1HqU4geVZtLR88KUJdG6BibgxJOK8gBvsSMoZjozUw
10+
MzAOBgNVHQ8BAf8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/
11+
BAIwADAKBggqhkjOPQQDAgNIADBFAiBQNm7l7CNEkAYbWskaMZe7W6qK7YOqGPKC
12+
mZe4f+JyEAIhAIyW9AupkwIVqAf4Y+qLXWw6Ou72P2cxacwnU/EqY5v3
13+
-----END CERTIFICATE-----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-----BEGIN EC PRIVATE KEY-----
2+
MHcCAQEEIJ8099eKaVtltKkoSsgxtDZ8nly8hEF8mzpoxgIUTKbPoAoGCCqGSM49
3+
AwEHoUQDQgAEz2IP7QsN4z0+8BGsTQGmnudiMasnsO3OZ6dHzg/qYVUguD3dR6lO
4+
IHlWbS0fPClCXRugYm4MSTivIAb7EjKGYw==
5+
-----END EC PRIVATE KEY-----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-----BEGIN EC PRIVATE KEY-----
2+
MHcCAQEEILD5s03CCydQC/fk15bPBIST29zSR640HZ6EFkljXQVvoAoGCCqGSM49
3+
AwEHoUQDQgAE0/ISZcJKpYbpui108lBDQZrrxtQ+O2GqKO8aJageK4GkOurcBlyG
4+
5v5AXfvuIJVNLXRxcYjRMfjRRgY0cnWxoA==
5+
-----END EC PRIVATE KEY-----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIICBTCCAaugAwIBAgIQBWuPAYs8k+OxJCws3MC9jDAKBggqhkjOPQQDAjBmMQsw
3+
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
4+
YW5jaXNjbzEUMBIGA1UEChMLT3JnMS1jaGlsZDIxFDASBgNVBAMTC09yZzEtY2hp
5+
bGQyMB4XDTE2MTIxOTEyMTQ1NFoXDTI2MTIxNzEyMTQ1NFowbDELMAkGA1UEBhMC
6+
VVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28x
7+
HDAaBgNVBAoTE09yZzEtY2hpbGQyLXNlcnZlcjExEjAQBgNVBAMTCWxvY2FsaG9z
8+
dDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABN10+yKShT7e72Eg4spl29gN8JWj
9+
FtrNF+7Htz8iuOXTjh0bXDaA39ZgXPQXPHHXb2qBOhFFty+IKjCKwtq9SJ6jNTAz
10+
MA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8E
11+
AjAAMAoGCCqGSM49BAMCA0gAMEUCIBamPit5An50gI0xmEgxKqdJXqKwMsbAsYlb
12+
WW61cdLqAiEAmNfaObAswKqpZ01uK9gef3Sq6h75Dvx3Y/Mi+YPL+6g=
13+
-----END CERTIFICATE-----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-----BEGIN EC PRIVATE KEY-----
2+
MHcCAQEEIBP5H0bLYye1oMhE/Nju+tYDqN0tHJzS1AssVSoEQMnKoAoGCCqGSM49
3+
AwEHoUQDQgAE3XT7IpKFPt7vYSDiymXb2A3wlaMW2s0X7se3PyK45dOOHRtcNoDf
4+
1mBc9Bc8cddvaoE6EUW3L4gqMIrC2r1Ing==
5+
-----END EC PRIVATE KEY-----

0 commit comments

Comments
 (0)