Skip to content

Commit c96688d

Browse files
committed
Convert certificates without using openssl
This implements PEM-encoded X.509 certificate parsing using Go crypto, and exports the result using SSLMate's go-pkcs12 package (or rather, cert-manager's fork of go-pkcs12 which adds support for encoding with a friendly name; see SSLMate/go-pkcs12#67 for details). Signed-off-by: Stephen Kitt <skitt@redhat.com>
1 parent 5581720 commit c96688d

File tree

11 files changed

+336
-44
lines changed

11 files changed

+336
-44
lines changed

go.mod

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ require (
1414
github.com/projectcalico/api v0.0.0-20230602153125-fb7148692637
1515
github.com/prometheus-community/pro-bing v0.7.0
1616
github.com/prometheus/client_golang v1.23.2
17-
github.com/submariner-io/admiral v0.23.0-m0.0.20260121163245-60a10fed6460
17+
github.com/submariner-io/admiral v0.23.0-m0.0.20260127095645-3bb5b8e6e7e9
1818
github.com/submariner-io/shipyard v0.23.0-m0.0.20260121161247-366b31d697ca
1919
github.com/tigera/operator/api v0.0.0-20250829192342-96fd517a8419
2020
github.com/vishvananda/netlink v1.3.1
@@ -30,7 +30,8 @@ require (
3030
sigs.k8s.io/controller-runtime v0.23.0
3131
sigs.k8s.io/knftables v0.0.19
3232
sigs.k8s.io/mcs-api v0.3.0
33-
sigs.k8s.io/structured-merge-diff/v6 v6.3.1
33+
sigs.k8s.io/structured-merge-diff/v6 v6.3.0
34+
software.sslmate.com/src/go-pkcs12 v0.6.0
3435
)
3536

3637
require (
@@ -101,3 +102,5 @@ require (
101102
sigs.k8s.io/randfill v1.0.0 // indirect
102103
sigs.k8s.io/yaml v1.6.0 // indirect
103104
)
105+
106+
replace software.sslmate.com/src/go-pkcs12 => github.com/cert-manager/go-pkcs12 v0.0.0-20250730101253-8f67713f0d8f

go.sum

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ github.com/cenkalti/hub v1.0.1 h1:UMtjc6dHSaOQTO15SVA50MBIR9zQwvsukQupDrkIRtg=
1515
github.com/cenkalti/hub v1.0.1/go.mod h1:tcYwtS3a2d9NO/0xDXVJWx3IedurUjYCqFCmpi0lpHs=
1616
github.com/cenkalti/rpc2 v0.0.0-20210604223624-c1acbc6ec984 h1:CNwZyGS6KpfaOWbh2yLkSy3rSTUh3jub9CzpFpP6PVQ=
1717
github.com/cenkalti/rpc2 v0.0.0-20210604223624-c1acbc6ec984/go.mod h1:v2npkhrXyk5BCnkNIiPdRI23Uq6uWPUQGL2hnRcRr/M=
18+
github.com/cert-manager/go-pkcs12 v0.0.0-20250730101253-8f67713f0d8f h1:FwCDR5Jrbj6wp/SDFVQoeBIOJYhWfLzUmxl/fSNdDOk=
19+
github.com/cert-manager/go-pkcs12 v0.0.0-20250730101253-8f67713f0d8f/go.mod h1:Qiz0EyvDRJjjxGyUQa2cCNZn/wMyzrRJ/qcDXOQazLI=
1820
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
1921
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
2022
github.com/containernetworking/cni v0.8.1 h1:7zpDnQ3T3s4ucOuJ/ZCLrYBxzkg0AELFfII3Epo9TmI=
@@ -187,6 +189,8 @@ github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu
187189
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
188190
github.com/submariner-io/admiral v0.23.0-m0.0.20260121163245-60a10fed6460 h1:rlvdzpXIatTx1+4bWuWn8GTKwe97dXxGREAP/SKLvLM=
189191
github.com/submariner-io/admiral v0.23.0-m0.0.20260121163245-60a10fed6460/go.mod h1:7OgtUvSZrwkK6uGIZRWfU57vOuz0X/MyQCyOE58olVU=
192+
github.com/submariner-io/admiral v0.23.0-m0.0.20260127095645-3bb5b8e6e7e9 h1:IqVZY1Y62Yd7al3S9Hz/N53ah5ou/We54QTWlSXaMWY=
193+
github.com/submariner-io/admiral v0.23.0-m0.0.20260127095645-3bb5b8e6e7e9/go.mod h1:7OgtUvSZrwkK6uGIZRWfU57vOuz0X/MyQCyOE58olVU=
190194
github.com/submariner-io/shipyard v0.23.0-m0.0.20260121161247-366b31d697ca h1:xZs0XkIh1zDP+I5Va8kuYezeBAfBRhZQ2AvUrTsGNI0=
191195
github.com/submariner-io/shipyard v0.23.0-m0.0.20260121161247-366b31d697ca/go.mod h1:RxZ0WiJQqJSdbjobbL1Q1kmKWSx24mBNZA4gD+4UxDE=
192196
github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY=
@@ -295,7 +299,7 @@ sigs.k8s.io/mcs-api v0.3.0 h1:LjRvgzjMrvO1904GP6XBJSnIX221DJMyQlZOYt9LAnM=
295299
sigs.k8s.io/mcs-api v0.3.0/go.mod h1:zZ5CK8uS6HaLkxY4HqsmcBHfzHuNMrY2uJy8T7jffK4=
296300
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
297301
sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
298-
sigs.k8s.io/structured-merge-diff/v6 v6.3.1 h1:JrhdFMqOd/+3ByqlP2I45kTOZmTRLBUm5pvRjeheg7E=
299-
sigs.k8s.io/structured-merge-diff/v6 v6.3.1/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE=
302+
sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco=
303+
sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE=
300304
sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs=
301305
sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4=

pkg/cable/libreswan/certificate_handler.go

Lines changed: 41 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ import (
2222
"bytes"
2323
"context"
2424
"crypto/sha256"
25+
"crypto/x509"
26+
"encoding/pem"
2527
"fmt"
2628
"os"
2729
"os/exec"
@@ -32,6 +34,7 @@ import (
3234
"github.com/submariner-io/admiral/pkg/command"
3335
"github.com/submariner-io/admiral/pkg/log"
3436
logf "sigs.k8s.io/controller-runtime/pkg/log"
37+
"software.sslmate.com/src/go-pkcs12"
3538
)
3639

3740
var certLogger = log.Logger{Logger: logf.Log.WithName("CertHandler")}
@@ -91,55 +94,61 @@ func (c *CertificateHandler) loadCertificate(ctx context.Context, certData []byt
9194
return errors.Wrapf(err, "failed to load certificate %q", nickname)
9295
}
9396

94-
//nolint:gosec // openssl/pk12util args are from trusted config
97+
//nolint:gosec // pk12util args are from trusted config
9598
func (c *CertificateHandler) loadPrivateKey(ctx context.Context, certData, keyData []byte, nickname string) error {
96-
// Write cert and key to temporary files
97-
certFile, err := os.CreateTemp(RootDir, "submariner-cert-*.crt")
98-
if err != nil {
99-
return errors.Wrap(err, "failed to create temporary cert file")
100-
}
101-
defer os.Remove(certFile.Name())
102-
103-
if _, err := certFile.Write(certData); err != nil {
104-
return errors.Wrap(err, "failed to write certificate to temporary file")
105-
}
106-
107-
certFile.Close()
108-
109-
keyFile, err := os.CreateTemp(RootDir, "submariner-key-*.key")
110-
if err != nil {
111-
return errors.Wrap(err, "failed to create temporary key file")
99+
// Parse certificate data
100+
var parsedCert *x509.Certificate
101+
var err error
102+
103+
for block, rest := pem.Decode(certData); block != nil; block, rest = pem.Decode(rest) {
104+
switch block.Type {
105+
case "CERTIFICATE":
106+
parsedCert, err = x509.ParseCertificate(block.Bytes)
107+
if err != nil {
108+
return errors.Wrap(err, "error parsing certificate data")
109+
}
110+
default:
111+
return fmt.Errorf("unexpected block type %q in certificate data", block.Type)
112+
}
112113
}
113-
defer os.Remove(keyFile.Name())
114114

115-
if _, err := keyFile.Write(keyData); err != nil {
116-
return errors.Wrap(err, "failed to write key to temporary file")
115+
// Parse key data
116+
var parsedKey any
117+
118+
for block, rest := pem.Decode(keyData); block != nil; block, rest = pem.Decode(rest) {
119+
switch block.Type {
120+
case "PRIVATE KEY":
121+
parsedKey, err = x509.ParsePKCS8PrivateKey(block.Bytes)
122+
if err != nil {
123+
return errors.Wrap(err, "error parsing key data")
124+
}
125+
default:
126+
return fmt.Errorf("unexpected block type %q in key data", block.Type)
127+
}
117128
}
118129

119-
keyFile.Close()
120-
121-
// Create PKCS#12 file with openssl
130+
// Export PKCS#12 file
122131
p12File, err := os.CreateTemp(RootDir, "submariner-client-*.p12")
123132
if err != nil {
124133
return errors.Wrap(err, "failed to create temporary pkcs12 file")
125134
}
126135

127136
defer os.Remove(p12File.Name())
128-
p12File.Close()
129137

130138
// Use empty password for PKCS#12
131139
pkcs12Password := ""
132140

133-
opensslCmd := exec.CommandContext(ctx, "openssl", "pkcs12", "-export",
134-
"-in", certFile.Name(),
135-
"-inkey", keyFile.Name(),
136-
"-out", p12File.Name(),
137-
"-name", nickname,
138-
"-passout", "pass:"+pkcs12Password)
139-
if err := execWithOutput(command.New(opensslCmd)); err != nil {
140-
return errors.Wrap(err, "failed to create PKCS#12 file")
141+
pkcsData, err := pkcs12.Modern.EncodeWithFriendlyName(nickname, parsedKey, parsedCert, []*x509.Certificate{}, pkcs12Password)
142+
if err != nil {
143+
return errors.Wrap(err, "error encoding to PKCS#12")
144+
}
145+
146+
if _, err := p12File.Write(pkcsData); err != nil {
147+
return errors.Wrap(err, "error writing PKCS#12 file")
141148
}
142149

150+
p12File.Close()
151+
143152
// Import PKCS#12 into NSS using pk12util
144153
pk12Cmd := exec.CommandContext(ctx, "pk12util", "-i", p12File.Name(), "-d", "sql:"+c.nssDBDir, "-W", pkcs12Password)
145154
err = execWithOutput(command.New(pk12Cmd))

pkg/cable/libreswan/certificate_handler_test.go

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ package libreswan_test
2020

2121
import (
2222
"context"
23+
_ "embed"
2324
"maps"
2425
"os"
2526
"os/exec"
@@ -33,11 +34,31 @@ import (
3334
"github.com/submariner-io/submariner/pkg/cable/libreswan"
3435
)
3536

37+
//go:generate openssl req -x509 -newkey rsa:4096 -keyout certs/ca.key -out certs/ca.crt -sha256 -days 3650 -nodes -subj "/C=XX/ST=State/L=City/O=Company/OU=Organisation/CN=CA"
38+
//go:embed certs/ca.crt
39+
var caCertContent []byte
40+
41+
//go:generate openssl req -new -newkey rsa:4096 -keyout certs/test.key -out certs/test.csr -nodes -subj "/C=XX/ST=State/L=City/O=Company/OU=Organisation/CN=test"
42+
//go:generate openssl x509 -req -in certs/test.csr -CA certs/ca.crt -CAkey certs/ca.key -CAcreateserial -out certs/test.crt -days 3650
43+
//go:embed certs/test.crt
44+
var testCertContent []byte
45+
46+
//go:embed certs/test.key
47+
var testKeyContent []byte
48+
49+
//go:generate openssl req -new -newkey rsa:4096 -keyout certs/new.key -out certs/new.csr -nodes -subj "/C=XX/ST=State/L=City/O=Company/OU=Organisation/CN=new"
50+
//go:generate openssl x509 -req -in certs/new.csr -CA certs/ca.crt -CAkey certs/ca.key -CAcreateserial -out certs/new.crt -days 3650
51+
//go:embed certs/new.crt
52+
var newCertContent []byte
53+
54+
//go:embed certs/new.key
55+
var newKeyContent []byte
56+
3657
var _ = Describe("CertificateHandler", func() {
3758
certData := map[string][]byte{
38-
certificate.CADataKey: []byte("-----BEGIN CERTIFICATE-----\nMOCK_CA_CERT\n-----END CERTIFICATE-----"),
39-
certificate.TLSDataKey: []byte("-----BEGIN CERTIFICATE-----\nMOCK_CLIENT_CERT\n-----END CERTIFICATE-----"),
40-
certificate.PrivateKeyDataKey: []byte("-----BEGIN PRIVATE KEY-----\nMOCK_CLIENT_KEY\n-----END PRIVATE KEY-----"),
59+
certificate.CADataKey: caCertContent,
60+
certificate.TLSDataKey: testCertContent,
61+
certificate.PrivateKeyDataKey: testKeyContent,
4162
}
4263

4364
var (
@@ -69,16 +90,15 @@ var _ = Describe("CertificateHandler", func() {
6990
cmdExecutor.AwaitCommand(ContainSubstring("certutil"), "-N", "-d", "sql:"+handler.NSSDatabaseDir())
7091
assertCmdStdIn(cmdExecutor.AwaitCommand(ContainSubstring("certutil"), "-A", libreswan.CACertName,
7192
"-d", "sql:"+handler.NSSDatabaseDir()), certData[certificate.CADataKey])
72-
cmdExecutor.AwaitCommand(ContainSubstring("openssl"), "pkcs12", "-export", "-name", libreswan.ClientCertName)
7393
cmdExecutor.AwaitCommand(ContainSubstring("pk12util"), "-d", "sql:"+handler.NSSDatabaseDir())
7494
cmdExecutor.Clear()
7595

7696
By("Invoking OnSignedCallback with new cert data")
7797

7898
newCertData := map[string][]byte{
79-
certificate.CADataKey: []byte("NEW_CA_CERT"),
80-
certificate.TLSDataKey: []byte("NEW_CLIENT_CERT"),
81-
certificate.PrivateKeyDataKey: []byte("NEW_CLIENT_KEY"),
99+
certificate.CADataKey: caCertContent,
100+
certificate.TLSDataKey: newCertContent,
101+
certificate.PrivateKeyDataKey: newKeyContent,
82102
}
83103
Expect(handler.OnSignedCallback(newCertData)).To(Succeed())
84104

@@ -132,7 +152,7 @@ var _ = Describe("CertificateHandler", func() {
132152
Expect(err).NotTo(HaveOccurred())
133153

134154
newCertData := maps.Clone(certData)
135-
newCertData[certificate.CADataKey] = []byte("NEW_CA_CERT")
155+
newCertData[certificate.CADataKey] = caCertContent
136156
Expect(handler.OnSignedCallback(newCertData)).To(Succeed())
137157

138158
cmdExecutor.EnsureNoCommand(ContainSubstring("certutil"), "-N")
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
*.csr
2+
*.srl
3+

pkg/cable/libreswan/certs/ca.crt

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIFpTCCA42gAwIBAgIUIH1PJfzEFashELD7QMDo8P0nGqYwDQYJKoZIhvcNAQEL
3+
BQAwYjELMAkGA1UEBhMCWFgxDjAMBgNVBAgMBVN0YXRlMQ0wCwYDVQQHDARDaXR5
4+
MRAwDgYDVQQKDAdDb21wYW55MRUwEwYDVQQLDAxPcmdhbmlzYXRpb24xCzAJBgNV
5+
BAMMAkNBMB4XDTI1MTAxMDA5MzcwN1oXDTM1MTAwODA5MzcwN1owYjELMAkGA1UE
6+
BhMCWFgxDjAMBgNVBAgMBVN0YXRlMQ0wCwYDVQQHDARDaXR5MRAwDgYDVQQKDAdD
7+
b21wYW55MRUwEwYDVQQLDAxPcmdhbmlzYXRpb24xCzAJBgNVBAMMAkNBMIICIjAN
8+
BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA04xSWeVHgbRAV7pJeKowchTXErLl
9+
HH6Ml9dxrB5DpaTQVFLv74e0x5ejb5GYYHA0ZBsBo0SPD6O7VvBZ5t/BQwx4VSDR
10+
qf89jQpW9Cc51zJkxAIbnpyhqRjm7ANruvZ2gNUZ+9/QvE//3WGie7VqArIWl8O0
11+
Klu030LpeVhP5BRqJLjQPl795U8r8+7vF4S7wq4z/mkuNzfbh+Gthy3WzH78rtXc
12+
u0P4PJ805asiEWC516OIXmun78WTTo2rN2AKwfXUhE8OVq6vrWCLnLiMhPotxUqJ
13+
ybct6JqV0A401iQI51YgKIgg2iU7kI+tmHHd6ayOjmOzqebx6tYutu/dr4tN6T5g
14+
v1SaA87B9STBMyJV7UhryRSrjg4chystsChZzbMHkevh505VMq8k+DxN0OgzLh11
15+
3Nyn5yZuxI35tMioI73hNqe3/u1iFa8+o4xLH75g/1Z2cyRTBwlpd6BsEjNpbWai
16+
jjrRFiXHGAlCX6VTj0pSqZLR6KHbg70W5t64bvLGmE/povFE+29fxf+ig9Pg3bEz
17+
VInR4HCq0fajxnJT6gSA2lho+f7v1dhbZi3LZInn9If8BY4LePhHK2ZuiUEV2449
18+
RhM1kQEVPla0hbGtSVdVwK6xWw4ohkCaQ6unxiaySjg3Lvoy606qkSZNjROOWae/
19+
ANXUDDOy4lDQJJsCAwEAAaNTMFEwHQYDVR0OBBYEFGoj9w1fiPCe59ecWFxtDHJn
20+
McVaMB8GA1UdIwQYMBaAFGoj9w1fiPCe59ecWFxtDHJnMcVaMA8GA1UdEwEB/wQF
21+
MAMBAf8wDQYJKoZIhvcNAQELBQADggIBAAd+Txs4xf/Me6F8uM5cGYltsk89+Q8X
22+
4Tf+NckDVq8ZjvySg7fu0OwdSIcc8Du0tOGj18ZpbFWnc9JeJ4tVVV6EoqLJsdJf
23+
e9sceUDMNN/KKpl5dYQbDFlt2HsL5+ff0DypO49iAn1GQ3MTj2/eoVXoJMwNnKyd
24+
t1OUdSI5zqozAQcS+zaYB7Q2QC2ZHFIXzHYiv5i4GStTI0C8+3aA6K+lSi6HRNWY
25+
rpucTgxPxT72lYWkYGNGKsowYFB4C4PZFJZ/U8HRxUaB8zvAfXHdNl9lFtlcTIiJ
26+
Bs1JaYiT05InTxTuLrWzxZCrVYUxJv+i+kOTWWpjBeE1grq7hxFt4ff5v6GD1mFS
27+
T7afEoYmxMiI4aukbSRzLAoeMi0B+dQmpZOwiLiTn52Lu1UftpAoq7wi53oYOJGW
28+
pFxA7EqdnqNeSm6b0AMjC5jEv8EH5AMc9qCq0+sWoJQw1G4/be5Tc/+V3lQotSSQ
29+
izhhqGg97oeUTKCciC9t7jZi9clirc2GoecnlbgzIaPyBBTctXNXbFEal/3PMNZD
30+
IhXEnUOc8XOVvMUSWOMjLgG/8VKzJXx4ZTfx6ZdNR58utRkn8XrojpgC6tx89Z/5
31+
VWxHPO68T3AIvFIfbVKFLcFtHXycs1x07Ut+Jt7nS87A6IHO6O5M5e3KitUuoJQl
32+
Y6I9F0UbRIwD
33+
-----END CERTIFICATE-----

pkg/cable/libreswan/certs/ca.key

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
-----BEGIN PRIVATE KEY-----
2+
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
51+
oJls5WrQwkYQBzHgRhZlOHQJA26GHg==
52+
-----END PRIVATE KEY-----

pkg/cable/libreswan/certs/new.crt

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIFlTCCA32gAwIBAgIUR2qWeJD0U82PiiinQDJkD0TYX/IwDQYJKoZIhvcNAQEL
3+
BQAwYjELMAkGA1UEBhMCWFgxDjAMBgNVBAgMBVN0YXRlMQ0wCwYDVQQHDARDaXR5
4+
MRAwDgYDVQQKDAdDb21wYW55MRUwEwYDVQQLDAxPcmdhbmlzYXRpb24xCzAJBgNV
5+
BAMMAkNBMB4XDTI1MTAxMDA5MzcwN1oXDTM1MTAwODA5MzcwN1owYzELMAkGA1UE
6+
BhMCWFgxDjAMBgNVBAgMBVN0YXRlMQ0wCwYDVQQHDARDaXR5MRAwDgYDVQQKDAdD
7+
b21wYW55MRUwEwYDVQQLDAxPcmdhbmlzYXRpb24xDDAKBgNVBAMMA25ldzCCAiIw
8+
DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALWHFN6gk/rxcZc0Vxp7hRA9jj4F
9+
XGYEXleJdGZlnd7OTKvaf2G6S1PP9GGe/4DXrCuP8ju7xj6sP3MljNqni5qTwVvA
10+
S7peBCy4N0mrtwY7AQw6MBdpeoyXw1WZntN778U92W1YeavFmz/GlQTM5T5bizGE
11+
nLUMsY1kfnPrBiPQPmHM5R+R9sBM7E33yiDY3Gst/xfZDmPR/eNbF3rOLQ13TCTn
12+
0ED9iJnXThYJjsYHZE4nFnOZKUUBoEG3dIR/I/JKNwejSrR4FVJtPMdE6qipRN18
13+
5YWBPYGpm5jQuAnW0xmuDCw+Sq12K+i+/s9DNUGVU3DpnfDpwKa1KIe3FXlpqV7J
14+
1JqA13Z05ANOEa+yAhW9sTj79kmX5Umu9OdCrY2WwxHhqa5yakBlecfcyhSON3Ug
15+
K1qhR/MyV5qqfYafkFQdxwK1t/LjCq6e+Y/iPguezNdD3GKb94HGCZMKbAq0ZTo1
16+
eIKEgqT5XhSXEsg57A90hiVsjNjnVu00Ivfim7SSk+KlJXv97Oz13cNz/UkjhstC
17+
egyD6gS61VsCycK7ulp+2S+AOsYuAiD3JOoflWEv3yNCZ0nWjl5meW9F2oZ/1tA3
18+
a8P+2sXZ4DIRhQonBDnKXDCmPFAs7aRXtS0fxrpRY4/U5iDk+mBUcAe6jv100sOC
19+
PxlMs4fl3+t/T0jJAgMBAAGjQjBAMB0GA1UdDgQWBBT5CGf5FN2wPg6ZiAE8B6Ip
20+
Gi0VsTAfBgNVHSMEGDAWgBRqI/cNX4jwnufXnFhcbQxyZzHFWjANBgkqhkiG9w0B
21+
AQsFAAOCAgEATrtuSF4boiYnlK12lF19zAqoKJGYWR8KhbXiuUmh9JjjP0aygKOA
22+
ihk/H/OQMe+PkzCcqoA/73ke2FBMJ3EY3cmthGiKVVSM1PuKw+Gc+wLmn7x9mlOQ
23+
u9Xmihy2TE9vgiogthXa/er2WBvEypWXyyDFi1MKOODeb3oYtVhMRdFquRdt+F8g
24+
KGCy50FGdVGMITli8c6olGV05vygDKCLy1Q9xnUUzYpfFiuv6yD6QUOBhcX6YbwM
25+
wnHmwqbK+PZQEqCTin69bh+aNHbteTrP8+dMIcEiiiuic4//s9Wt9QWij5ZVWKxF
26+
c6T07Yb1MBGZpcXG0Cfr5kmoXiX6dzTLUVazgtCeaW9X4HCxv4ZWgodVpwfVUAHb
27+
Be/xkR2V/V4tqj8CCEJhuyqy7eKxXfa3Fxav1QWYx3HBa3S2uK+km+bRFnWvtXWx
28+
B/nJ7CN04iqJiP7xBnaqRqw+gT6RnrMET2+I2HD7cxPT5rAY5YxktrUXaajtut9P
29+
mlji3qX1n88/ZEH/5fDjhStQO/du8U8C8fN2zMNPOXM+qW8T+eAQNP9t35e+0Wzf
30+
O+2g7cPoIVdpmvzJNNaytuDvPvqncpQQG5eXXjhfzQLjrgeHfiB9iJ8FHwuDftL4
31+
bRbPhhyHIceUCbqYzmSBNiws566U75PazcNkesI/v9muaorOVnoIgGE=
32+
-----END CERTIFICATE-----

0 commit comments

Comments
 (0)