Skip to content

Commit d276186

Browse files
authored
Feat/support p384 p521 certs (#12)
Co-authored-by: Nicolas Puffay <[email protected]>
1 parent fb566e5 commit d276186

File tree

4 files changed

+42
-8
lines changed

4 files changed

+42
-8
lines changed

.github/workflows/push.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121
with:
2222
go-version: "1.17"
2323
- run: make build-linux
24-
- uses: actions/upload-artifact@v3
24+
- uses: actions/upload-artifact@v4
2525
with:
2626
name: bin
2727
path: bin/

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ Downstream TLS certificates can be dynamically fetched and updated from Kubernet
139139

140140
In this mode, only a single `certificate` may be specified in Yggdrasil configuration. It will be used for hosts with misconfigured or invalid secret.
141141

142-
**Note**: ECDSA >256 keys are not supported by envoy and will be discarded. See https://github.com/envoyproxy/envoy/issues/10855
142+
**Note**: ECDSA P-256, P-384 and P-521 keys are now supported by envoy (see https://github.com/envoyproxy/envoy/issues/10855)
143143

144144
## Configuration
145145
Yggdrasil can be configured using a config file e.g:

pkg/envoy/ingress_translator.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -338,8 +338,8 @@ func validateTlsSecret(secret *v1.Secret) (bool, error) {
338338
return false, nil
339339
}
340340

341-
// discard P-384 EC private keys
342-
// see https://github.com/envoyproxy/envoy/issues/10855
341+
// discard > P-521 EC private keys
342+
// P-256, P-384 & P-521 are now supported (see https://github.com/envoyproxy/envoy/issues/10855)
343343
block, _ := pem.Decode(tlsCert)
344344
if block == nil {
345345
return false, fmt.Errorf("error parsing x509 certificate - no PEM block found")
@@ -353,8 +353,8 @@ func validateTlsSecret(secret *v1.Secret) (bool, error) {
353353
if !ok {
354354
return false, fmt.Errorf("error in *ecdsa.PublicKey type assertion")
355355
}
356-
if ecdsaPub.Curve.Params().BitSize > 256 {
357-
logrus.Infof("skipping ECDSA %s certificate %s/%s: only P-256 certificates are supported", ecdsaPub.Curve.Params().Name, secret.Namespace, secret.Name)
356+
if ecdsaPub.Curve.Params().BitSize > 521 {
357+
logrus.Infof("skipping ECDSA %s certificate %s/%s: only P-256, P-384 and P-521 certificates are supported", ecdsaPub.Curve.Params().Name, secret.Namespace, secret.Name)
358358
return false, nil
359359
}
360360
}

pkg/envoy/ingress_translator_test.go

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,28 @@ HMDnomVYrn/CmceQFWDWQ/dLG3OgiffsjhxOS0IaaDKgUxJH7/eW5AesWmhg1z9x
5353
0JSjab6mTneQMtHukPZEaLmwPlksEA1k2A/wph9mEjyZpgS4IogLORA=
5454
-----END PRIVATE KEY-----`
5555

56+
// dummy p-521 cert
57+
p521crt = `-----BEGIN CERTIFICATE-----
58+
MIIB/TCCAV6gAwIBAgIUalLHxUR4R/cATXoia/hwou1UYY0wCgYIKoZIzj0EAwIw
59+
EDEOMAwGA1UEAwwFZHVtbXkwHhcNMjUwNjE3MDgyNzU5WhcNMjYwNjE3MDgyNzU5
60+
WjAQMQ4wDAYDVQQDDAVkdW1teTCBmzAQBgcqhkjOPQIBBgUrgQQAIwOBhgAEAKIU
61+
tBnFN/IIlNPkg/qiWSq8OtOJA76BrltrjGm7RkXCh7AGEi4JhBo7kElp/oqE8D6W
62+
Lze2+NHoczEZ6P2vOXbPAHIj9J+ti1fFm9prRTeV0Hn+YOqWBirnzu+2X3Vi2gSF
63+
q2tmIIMyWQBqt+T4zGo1qBTpfX1cIBG7baMMjK4xC7QJo1MwUTAdBgNVHQ4EFgQU
64+
aZAE5vnNQV2ztM/47huVttmWHjYwHwYDVR0jBBgwFoAUaZAE5vnNQV2ztM/47huV
65+
ttmWHjYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAgOBjAAwgYgCQgDtOZt1
66+
OrmrEMbnB48DR52iFw1OR1ppXdCno4Owk2Amu/N3tuIsKctxtSrxQhejh4L+BNHh
67+
y1mXVMilq41U+gbhZAJCAUKFcuGqUdMFUhCmKHC78YIN8PCeZ56mE2hqSwprBJGS
68+
pzAmjBamDqkRJP4UdTjER1KyQfZJ1126r/TxA9+Tnn1j
69+
-----END CERTIFICATE-----`
70+
p521key = `-----BEGIN EC PRIVATE KEY-----
71+
MIHcAgEBBEIAmn+TNqs72qAK6BfgaeNDlE+lr/+vP54s+zQAv4dWwJoGLoouzNSr
72+
Tim9rC01Ut1+5b9M4W5Ridx+E6aOU8G46fCgBwYFK4EEACOhgYkDgYYABACiFLQZ
73+
xTfyCJTT5IP6olkqvDrTiQO+ga5ba4xpu0ZFwoewBhIuCYQaO5BJaf6KhPA+li83
74+
tvjR6HMxGej9rzl2zwByI/SfrYtXxZvaa0U3ldB5/mDqlgYq587vtl91YtoEhatr
75+
ZiCDMlkAarfk+MxqNagU6X19XCARu22jDIyuMQu0CQ==
76+
-----END EC PRIVATE KEY-----`
77+
5678
// dummy rsa2048 cert
5779
rsa2048crt = `-----BEGIN CERTIFICATE-----
5880
MIIDETCCAfkCFArEpbFYH4WmMV2id+QeAriE3c+CMA0GCSqGSIb3DQEBCwUAMEUx
@@ -530,15 +552,27 @@ func TestValidateWrongPEMTlsSecret(t *testing.T) {
530552
}
531553
}
532554

555+
func TestValidateP521TlsSecret(t *testing.T) {
556+
sec := &v1.Secret{ObjectMeta: metav1.ObjectMeta{Namespace: "ns", Name: "sec"}, Data: map[string][]byte{
557+
"tls.crt": []byte(p521crt),
558+
"tls.key": []byte(p521key),
559+
}}
560+
if v, err := validateTlsSecret(sec); err != nil {
561+
t.Errorf("expected no error, caught: %s", err.Error())
562+
} else if !v {
563+
t.Errorf("expected ECDSA P-521 cert to be valid")
564+
}
565+
}
566+
533567
func TestValidateP384TlsSecret(t *testing.T) {
534568
sec := &v1.Secret{ObjectMeta: metav1.ObjectMeta{Namespace: "ns", Name: "sec"}, Data: map[string][]byte{
535569
"tls.crt": []byte(p384crt),
536570
"tls.key": []byte(p384key),
537571
}}
538572
if v, err := validateTlsSecret(sec); err != nil {
539573
t.Errorf("expected no error, caught: %s", err.Error())
540-
} else if v {
541-
t.Errorf("expected ECDSA >256 cert to be invalid")
574+
} else if !v {
575+
t.Errorf("expected ECDSA P-384 cert to be valid")
542576
}
543577
}
544578

0 commit comments

Comments
 (0)