Skip to content

Commit f7ed239

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 d1f90b3 commit f7ed239

File tree

13 files changed

+425
-43
lines changed

13 files changed

+425
-43
lines changed

go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ require (
3131
sigs.k8s.io/knftables v0.0.19
3232
sigs.k8s.io/mcs-api v0.3.0
3333
sigs.k8s.io/structured-merge-diff/v4 v4.7.0
34+
software.sslmate.com/src/go-pkcs12 v0.6.0
3435
)
3536

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

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ github.com/cenkalti/hub v1.0.1 h1:UMtjc6dHSaOQTO15SVA50MBIR9zQwvsukQupDrkIRtg=
1717
github.com/cenkalti/hub v1.0.1/go.mod h1:tcYwtS3a2d9NO/0xDXVJWx3IedurUjYCqFCmpi0lpHs=
1818
github.com/cenkalti/rpc2 v0.0.0-20210604223624-c1acbc6ec984 h1:CNwZyGS6KpfaOWbh2yLkSy3rSTUh3jub9CzpFpP6PVQ=
1919
github.com/cenkalti/rpc2 v0.0.0-20210604223624-c1acbc6ec984/go.mod h1:v2npkhrXyk5BCnkNIiPdRI23Uq6uWPUQGL2hnRcRr/M=
20+
github.com/cert-manager/go-pkcs12 v0.0.0-20250730101253-8f67713f0d8f h1:FwCDR5Jrbj6wp/SDFVQoeBIOJYhWfLzUmxl/fSNdDOk=
21+
github.com/cert-manager/go-pkcs12 v0.0.0-20250730101253-8f67713f0d8f/go.mod h1:Qiz0EyvDRJjjxGyUQa2cCNZn/wMyzrRJ/qcDXOQazLI=
2022
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
2123
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
2224
github.com/containernetworking/cni v0.8.1 h1:7zpDnQ3T3s4ucOuJ/ZCLrYBxzkg0AELFfII3Epo9TmI=

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")}
@@ -93,55 +96,61 @@ func (c *CertificateHandler) loadCertificate(ctx context.Context, certData []byt
9396
return errors.Wrapf(err, "failed to load certificate %q", nickname)
9497
}
9598

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

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

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

129138
defer os.Remove(p12File.Name())
130-
p12File.Close()
131139

132140
// Use empty password for PKCS#12
133141
pkcs12Password := ""
134142

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

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

pkg/cable/libreswan/certificate_handler_test.go

Lines changed: 39 additions & 11 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,39 @@ 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/mock.key -out certs/mock.csr -nodes -subj "/C=XX/ST=State/L=City/O=Company/OU=Organisation/CN=mock"
50+
//go:generate openssl x509 -req -in certs/mock.csr -CA certs/ca.crt -CAkey certs/ca.key -CAcreateserial -out certs/mock.crt -days 3650
51+
//go:embed certs/mock.crt
52+
var mockCertContent []byte
53+
54+
//go:embed certs/mock.key
55+
var mockKeyContent []byte
56+
57+
//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"
58+
//go:generate openssl x509 -req -in certs/new.csr -CA certs/ca.crt -CAkey certs/ca.key -CAcreateserial -out certs/new.crt -days 3650
59+
//go:embed certs/new.crt
60+
var newCertContent []byte
61+
62+
//go:embed certs/new.key
63+
var newKeyContent []byte
64+
3665
var _ = Describe("CertificateHandler", func() {
3766
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-----"),
67+
certificate.CADataKey: caCertContent,
68+
certificate.TLSDataKey: testCertContent,
69+
certificate.PrivateKeyDataKey: testKeyContent,
4170
}
4271

4372
var (
@@ -69,16 +98,15 @@ var _ = Describe("CertificateHandler", func() {
6998
cmdExecutor.AwaitCommand(ContainSubstring("certutil"), "-N", "-d", "sql:"+handler.NSSDatabaseDir())
7099
assertCmdStdIn(cmdExecutor.AwaitCommand(ContainSubstring("certutil"), "-A", libreswan.CACertName,
71100
"-d", "sql:"+handler.NSSDatabaseDir()), certData[certificate.CADataKey])
72-
cmdExecutor.AwaitCommand(ContainSubstring("openssl"), "pkcs12", "-export", "-name", libreswan.ClientCertName)
73101
cmdExecutor.AwaitCommand(ContainSubstring("pk12util"), "-d", "sql:"+handler.NSSDatabaseDir())
74102
cmdExecutor.Clear()
75103

76104
By("Invoking OnSignedCallback with new cert data")
77105

78106
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"),
107+
certificate.CADataKey: caCertContent,
108+
certificate.TLSDataKey: newCertContent,
109+
certificate.PrivateKeyDataKey: newKeyContent,
82110
}
83111
Expect(handler.OnSignedCallback(newCertData)).To(Succeed())
84112

@@ -132,7 +160,7 @@ var _ = Describe("CertificateHandler", func() {
132160
Expect(err).NotTo(HaveOccurred())
133161

134162
newCertData := maps.Clone(certData)
135-
newCertData[certificate.CADataKey] = []byte("NEW_CA_CERT")
163+
newCertData[certificate.CADataKey] = caCertContent
136164
Expect(handler.OnSignedCallback(newCertData)).To(Succeed())
137165

138166
cmdExecutor.EnsureNoCommand(ContainSubstring("certutil"), "-N")
@@ -159,9 +187,9 @@ func (m *mockSigningRequestor) Issue(_ context.Context, _ string, sanIPs []strin
159187
}
160188

161189
certData := map[string][]byte{
162-
certificate.TLSDataKey: []byte("mock-tls-cert"),
163-
certificate.PrivateKeyDataKey: []byte("mock-tls-key"),
164-
certificate.CADataKey: []byte("mock-ca-cert"),
190+
certificate.TLSDataKey: mockCertContent,
191+
certificate.PrivateKeyDataKey: mockKeyContent,
192+
certificate.CADataKey: caCertContent,
165193
}
166194

167195
return onSigned(certData)
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/mock.crt

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIFljCCA36gAwIBAgIUR2qWeJD0U82PiiinQDJkD0TYX/EwDQYJKoZIhvcNAQEL
3+
BQAwYjELMAkGA1UEBhMCWFgxDjAMBgNVBAgMBVN0YXRlMQ0wCwYDVQQHDARDaXR5
4+
MRAwDgYDVQQKDAdDb21wYW55MRUwEwYDVQQLDAxPcmdhbmlzYXRpb24xCzAJBgNV
5+
BAMMAkNBMB4XDTI1MTAxMDA5MzcwN1oXDTM1MTAwODA5MzcwN1owZDELMAkGA1UE
6+
BhMCWFgxDjAMBgNVBAgMBVN0YXRlMQ0wCwYDVQQHDARDaXR5MRAwDgYDVQQKDAdD
7+
b21wYW55MRUwEwYDVQQLDAxPcmdhbmlzYXRpb24xDTALBgNVBAMMBG1vY2swggIi
8+
MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCp5i95yhfNUqPl0NFpHdaH31DX
9+
QeHfY6UTFBvKNR+pBlyUXg7x+dGYw+sFxjofpk8Quz2HEEXgszXKYw0NFfdxJG4H
10+
Gz+Qzx9B653XZIVoqwbUf9aakXjarTLeUG/kdlIkPwFCOy1Nn7AO2x//Sl7ic+W3
11+
LkjbsedEKTg2ejQzVFGEnipPGuTQ/EQdl4JmHLCNi5TM9CTCu3b6dPJLZCgYAryR
12+
nkvklvZjiUo7bVldbzL+oMufBDVna3etGnUcrMJpekSEDQ5zdvUPVzukqmRbWgpK
13+
FhffMlZWswrrP8osyu4ytQWWMDU6KJJH7lf1GsK2gxjaGwBRwoSXi1KaYvDRTGL9
14+
YC97OoIylQHdmN7AW5+MnLQKfsQEWzcNt3n4F6G50PbVVgIR3DKu9yItUdkxIi4V
15+
CYUNaOrUpAPd4jxl7SENckh2bhgewBswPQqovBtDksE2wnsrIja7UO0lVKNmfsBF
16+
zHGum1w1K3w5AVylgB4tJ5+CXCVZDWqs9Ul8PWciD2m/M6yDG592/ox9tXeeYg8m
17+
7PbBnc/1+1kBiMbgokwoOeCNjjshoqwnj3J7Tk7oCIRTA+0ZvdE8OJlDGvmAEU71
18+
9jsndrzDpKUSu1d/MaySlpV/wPhrxcjsVxVW1W1/8KuhVRLgBkQqk8IcvKyaAdDf
19+
5OTZ9k65rT9tPbncNwIDAQABo0IwQDAdBgNVHQ4EFgQUv5ugMb8KgpTSJBuK198U
20+
JZnqOJkwHwYDVR0jBBgwFoAUaiP3DV+I8J7n15xYXG0McmcxxVowDQYJKoZIhvcN
21+
AQELBQADggIBAC8dfxz3YV35HbA7gZ2vvasRNCEeJI4m8dtkpkRFpEK7PcvFykn3
22+
xOXFewIvVSIJ3dqN+2jHnbuntQsDNXcbk8KOXyTlEb10Ve3AYndYxp+Udu+ZHAfi
23+
tWWN2WPILiKot9X2dTFjTAsDekSrsPl6ySh9SxbWa9UYCnejV3c4+81joFdN7Yli
24+
6Dl4iUM1JRiyb2hJP1tQYy+0InanGM8aT9yAbRY79ceAJ+2IU7pPHtYpp2X+YvoE
25+
j7Z9lIsERkhf8tINA7yUDEZiPwn63Iy1yKDSjr9FYAVE0tExhvrldOF4813pE30r
26+
Gl8m3IfzHwXRRKRsR0KVDoPz2kT6DFUCDUuKIjopzCgi0rKfSkQwaTXM4V2+2Dwj
27+
NU+Q5cjsV0OtIMTq2Fv0o1feI6qYdPf2KE+tvFmlruHCVyY7Hd5k6aaVvtnQgyN4
28+
yjDXcaC6vJC3mfDy/b8O0A3uLY97mssBEg+DvpHXCCvf/mfe1xKtjpKdLL2broW4
29+
DeCtYc6k9/Rl9gTLDP9iZlngEiZmsbIH5aLngdsIANV1Qz6ew00xDGfGP3EjGrhg
30+
yDgCbmSMy58uwbJVTNqxu1+6PGdtc8lBu6hEhcTyl/aOVMrCIN57xIcVnu9ff9hK
31+
D5fmDfC3gu8ithl3+XFXQ7wcsiLTfzxPl32vke2i5hYsG2dOJwYPnI6b
32+
-----END CERTIFICATE-----

0 commit comments

Comments
 (0)