Skip to content

Commit 9f25066

Browse files
authored
fix: followup for #8380 (#8666)
* improve status message Signed-off-by: zirain <zirain2009@gmail.com> * allow to disable validation Signed-off-by: zirain <zirain2009@gmail.com> * address follow up for 8380 Signed-off-by: zirain <zirain2009@gmail.com> * address TODO Signed-off-by: zirain <zirain2009@gmail.com> --------- Signed-off-by: zirain <zirain2009@gmail.com>
1 parent bbdb718 commit 9f25066

7 files changed

Lines changed: 924 additions & 22 deletions

internal/gatewayapi/backendtlspolicy.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -531,7 +531,7 @@ func (t *Translator) getCaCertsFromCARefs(resources *resource.Resources, caCerti
531531
},
532532
resources.ReferenceGrants,
533533
) {
534-
return nil, ErrRefNotPermitted
534+
return nil, fmt.Errorf("%w for caCertificateRef %s/%s (kind: %s, namespace: %s)", ErrRefNotPermitted, caRef.Group, caRef.Name, kind, caRefNs)
535535
}
536536
}
537537

@@ -582,7 +582,7 @@ func (t *Translator) getCaCertsFromCARefs(resources *resource.Resources, caCerti
582582

583583
if ca == "" {
584584
if !foundSupportedRef {
585-
return nil, ErrInvalidCACertificateKind
585+
return nil, fmt.Errorf("%w in caCertificateRefs", ErrInvalidCACertificateKind)
586586
}
587587
return nil, ErrNoValidCACertificate
588588
}

internal/gatewayapi/contexts.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,16 @@ type ResourceMetadata struct {
4545
// Precedence order (highest to lowest):
4646
// 1. Gateway.spec.tls.backend configuration
4747
// 2. EnvoyProxy.spec.backendTLS (attached to Gateway or GatewayClass)
48+
//
49+
// TODO: Merging fields in EnvoyProxy and Gateway TLS configs should be considered.
4850
func (g *GatewayContext) GetBackendTLSConfig() (*egv1a1.BackendTLSConfig, *ResourceMetadata) {
49-
if g.backendTLS != nil {
51+
// If Gateway.spec.tls.backend is configured, it takes precedence over
52+
// EnvoyProxy.spec.backendTLS even when translation produced no usable
53+
// backendTLS config (for example, due to invalid clientCertificateRef).
54+
if g.Gateway != nil && g.Spec.TLS != nil && g.Spec.TLS.Backend != nil {
55+
if g.backendTLS == nil {
56+
return nil, nil
57+
}
5058
return g.backendTLS, &ResourceMetadata{
5159
Namespace: g.Namespace,
5260
Name: g.Name,

internal/gatewayapi/listener.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ func (t *Translator) ProcessGatewayTLS(gateways []*GatewayContext, resources *re
8282
gtwPerPortCaCertificate := make(map[gwapiv1.PortNumber]*ListenerFrontendTLSValidation)
8383
for _, portValidation := range gtw.Spec.TLS.Frontend.PerPort {
8484
if portValidation.TLS.Validation == nil {
85+
// An explicit per-port tls override with no validation disables
86+
// frontend default validation on that port.
87+
gtwPerPortCaCertificate[portValidation.Port] = nil
8588
continue
8689
}
8790
caCert, err := t.getCaCertsFromCARefs(resources, portValidation.TLS.Validation.CACertificateRefs, resource.ResourceMetadata{

internal/gatewayapi/testdata/backendtlspolicy-invalid-ca.out.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,13 @@ backendTLSPolicies:
6060
conditions:
6161
- lastTransitionTime: null
6262
message: Unsupported reference kind, supported kinds are ConfigMap, Secret,
63-
and ClusterTrustBundle.
63+
and ClusterTrustBundle in caCertificateRefs.
6464
reason: NoValidCACertificate
6565
status: "False"
6666
type: Accepted
6767
- lastTransitionTime: null
6868
message: Unsupported reference kind, supported kinds are ConfigMap, Secret,
69-
and ClusterTrustBundle.
69+
and ClusterTrustBundle in caCertificateRefs.
7070
reason: InvalidKind
7171
status: "False"
7272
type: ResolvedRefs
@@ -145,7 +145,7 @@ httpRoutes:
145145
- lastTransitionTime: null
146146
message: |-
147147
Failed to process route rule 0 backendRef 0: configmap no-ca-cmap not found in namespace backends.
148-
Failed to process route rule 0 backendRef 1: Unsupported reference kind, supported kinds are ConfigMap, Secret, and ClusterTrustBundle.
148+
Failed to process route rule 0 backendRef 1: Unsupported reference kind, supported kinds are ConfigMap, Secret, and ClusterTrustBundle in caCertificateRefs.
149149
reason: InvalidBackendTLS
150150
status: "False"
151151
type: ResolvedRefs

internal/gatewayapi/testdata/gateway-tls-frontend-backend.in.yaml

Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,108 @@ gateways:
185185
- group: ""
186186
kind: Secret
187187
name: tls-validity-checks-certificate
188+
- apiVersion: gateway.networking.k8s.io/v1
189+
kind: Gateway
190+
metadata:
191+
name: client-validation-per-port-disable-default
192+
namespace: envoy-gateway
193+
spec:
194+
gatewayClassName: envoy-gateway-class
195+
tls:
196+
frontend:
197+
default:
198+
validation:
199+
caCertificateRefs:
200+
- kind: ConfigMap
201+
group: ""
202+
name: tls-validity-checks-ca-certificate
203+
perPort:
204+
- port: 8443
205+
tls: {}
206+
listeners:
207+
- name: https
208+
port: 443
209+
protocol: HTTPS
210+
allowedRoutes:
211+
namespaces:
212+
from: Same
213+
tls:
214+
certificateRefs:
215+
- group: ""
216+
kind: Secret
217+
name: tls-validity-checks-certificate
218+
- name: https-disable-default-validation
219+
port: 8443
220+
protocol: HTTPS
221+
allowedRoutes:
222+
namespaces:
223+
from: Same
224+
tls:
225+
certificateRefs:
226+
- group: ""
227+
kind: Secret
228+
name: tls-validity-checks-certificate
229+
- apiVersion: gateway.networking.k8s.io/v1
230+
kind: Gateway
231+
metadata:
232+
name: client-validation-per-port-disable-invalid-default
233+
namespace: envoy-gateway
234+
spec:
235+
gatewayClassName: envoy-gateway-class
236+
tls:
237+
frontend:
238+
default:
239+
validation:
240+
caCertificateRefs:
241+
- kind: ConfigMap
242+
group: ""
243+
name: does-not-exist
244+
perPort:
245+
- port: 8443
246+
tls: {}
247+
listeners:
248+
- name: https-invalid-default
249+
port: 443
250+
protocol: HTTPS
251+
allowedRoutes:
252+
namespaces:
253+
from: Same
254+
tls:
255+
certificateRefs:
256+
- group: ""
257+
kind: Secret
258+
name: tls-validity-checks-certificate
259+
- name: https-disable-default-validation
260+
port: 8443
261+
protocol: HTTPS
262+
allowedRoutes:
263+
namespaces:
264+
from: Same
265+
tls:
266+
certificateRefs:
267+
- group: ""
268+
kind: Secret
269+
name: tls-validity-checks-certificate
270+
- apiVersion: gateway.networking.k8s.io/v1
271+
kind: Gateway
272+
metadata:
273+
name: invalid-gateway-backend-client-cert-no-fallback
274+
namespace: envoy-gateway
275+
spec:
276+
gatewayClassName: envoy-gateway-class
277+
listeners:
278+
- name: http
279+
port: 8080
280+
protocol: HTTP
281+
allowedRoutes:
282+
namespaces:
283+
from: All
284+
tls:
285+
backend:
286+
clientCertificateRef:
287+
group: ""
288+
kind: ConfigMap
289+
name: invalid-kind
188290
- apiVersion: gateway.networking.k8s.io/v1
189291
kind: Gateway
190292
metadata:
@@ -303,6 +405,79 @@ httpRoutes:
303405
- backendRefs:
304406
- name: service-1
305407
port: 8080
408+
- apiVersion: gateway.networking.k8s.io/v1
409+
kind: HTTPRoute
410+
metadata:
411+
name: invalid-gateway-backend-client-cert-no-fallback
412+
namespace: default
413+
spec:
414+
parentRefs:
415+
- name: invalid-gateway-backend-client-cert-no-fallback
416+
namespace: envoy-gateway
417+
hostnames:
418+
- mTLS.example.org
419+
rules:
420+
- backendRefs:
421+
- name: tls-backend
422+
namespace: default
423+
port: 443
424+
services:
425+
- apiVersion: v1
426+
kind: Service
427+
metadata:
428+
name: tls-backend
429+
namespace: default
430+
spec:
431+
clusterIP: 10.22.33.44
432+
ports:
433+
- port: 443
434+
name: https
435+
protocol: TCP
436+
targetPort: 443
437+
endpointSlices:
438+
- apiVersion: discovery.k8s.io/v1
439+
kind: EndpointSlice
440+
metadata:
441+
name: endpointslice-tls-backend
442+
namespace: default
443+
labels:
444+
kubernetes.io/service-name: tls-backend
445+
addressType: IPv4
446+
ports:
447+
- name: https
448+
protocol: TCP
449+
port: 443
450+
endpoints:
451+
- addresses:
452+
- "10.244.0.22"
453+
conditions:
454+
ready: true
455+
backendTLSPolicies:
456+
- apiVersion: gateway.networking.k8s.io/v1alpha2
457+
kind: BackendTLSPolicy
458+
metadata:
459+
name: tls-backend-policy
460+
namespace: default
461+
spec:
462+
targetRefs:
463+
- group: ""
464+
kind: Service
465+
name: tls-backend
466+
validation:
467+
wellKnownCACertificates: System
468+
hostname: backend.example.org
469+
envoyProxyForGatewayClass:
470+
apiVersion: gateway.envoyproxy.io/v1alpha1
471+
kind: EnvoyProxy
472+
metadata:
473+
namespace: envoy-gateway-system
474+
name: backend-client-cert-default
475+
spec:
476+
backendTLS:
477+
clientCertificateRef:
478+
group: ""
479+
kind: Secret
480+
name: global-backend-client-cert
306481
secrets:
307482
- apiVersion: v1
308483
kind: Secret
@@ -313,6 +488,15 @@ secrets:
313488
data:
314489
tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUREVENDQWZXZ0F3SUJBZ0lVRUZNaFA5ZUo5WEFCV3NRNVptNmJSazJjTE5Rd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0ZqRVVNQklHQTFVRUF3d0xabTl2TG1KaGNpNWpiMjB3SGhjTk1qUXdNakk1TURrek1ERXdXaGNOTXpRdwpNakkyTURrek1ERXdXakFXTVJRd0VnWURWUVFEREF0bWIyOHVZbUZ5TG1OdmJUQ0NBU0l3RFFZSktvWklodmNOCkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFKbEk2WXhFOVprQ1BzNnBDUXhickNtZWl4OVA1RGZ4OVJ1NUxENFQKSm1kVzdJS2R0UVYvd2ZMbXRzdTc2QithVGRDaldlMEJUZmVPT1JCYlIzY1BBRzZFbFFMaWNsUVVydW4zcStncwpKcEsrSTdjSStqNXc4STY4WEg1V1E3clZVdGJ3SHBxYncrY1ZuQnFJVU9MaUlhdGpJZjdLWDUxTTF1RjljZkVICkU0RG5jSDZyYnI1OS9SRlpCc2toeHM1T3p3Sklmb2hreXZGd2V1VHd4Sy9WcGpJKzdPYzQ4QUJDWHBOTzlEL3EKRWgrck9hdWpBTWNYZ0hRSVRrQ2lpVVRjVW82TFNIOXZMWlB0YXFmem9acTZuaE1xcFc2NUUxcEF3RjNqeVRUeAphNUk4SmNmU0Zqa2llWjIwTFVRTW43TThVNHhIamFvL2d2SDBDQWZkQjdSTFUyc0NBd0VBQWFOVE1GRXdIUVlEClZSME9CQllFRk9SQ0U4dS8xRERXN2loWnA3Y3g5dFNtUG02T01COEdBMVVkSXdRWU1CYUFGT1JDRTh1LzFERFcKN2loWnA3Y3g5dFNtUG02T01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQgpBRnQ1M3pqc3FUYUg1YThFMmNodm1XQWdDcnhSSzhiVkxNeGl3TkdqYm1FUFJ6K3c2TngrazBBOEtFY0lEc0tjClNYY2k1OHU0b1didFZKQmx6YS9adWpIUjZQMUJuT3BsK2FveTc4NGJiZDRQMzl3VExvWGZNZmJCQ20xdmV2aDkKQUpLbncyWnRxcjRta2JMY3hFcWxxM3NCTEZBUzlzUUxuS05DZTJjR0xkVHAyYm9HK3FjZ3lRZ0NJTTZmOEVNdgpXUGlmQ01NR3V6Sy9HUkY0YlBPL1lGNDhld0R1M1VlaWgwWFhkVUFPRTlDdFVhOE5JaGMxVVBhT3pQcnRZVnFyClpPR2t2L0t1K0I3OGg4U0VzTzlYclFjdXdiT25KeDZLdFIrYWV5a3ZBcFhDUTNmWkMvYllLQUFSK1A4QUpvUVoKYndJVW1YaTRnajVtK2JLUGhlK2lyK0U9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
315490
tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2UUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktjd2dnU2pBZ0VBQW9JQkFRQ2QwZlBDYWtweE1nUnUKT0VXQjFiQk5FM3ZseW55aTZWbkV2VWF1OUhvakR2UHVPTFJIaGI4MmoyY1ovMHhnL1lKR09LelBuV2JERkxGNApHdWh3dDRENmFUR0xYNklPODEwTDZ0SXZIWGZNUXRJS2VwdTZ3K3p1WVo4bG1yejB1RjZlWEtqamVIbHhyb2ZrCnVNekM3OUVaU0lYZlZlczJ1SmdVRSs4VGFzSDUzQ2Y4MFNSRGlIeEdxckttdVNjWCtwejBreGdCZ1VWYTVVS20KUWdTZDFmVUxLOUEwNXAxOXkrdURPM204bVhRNkxVQ0N1STFwZHNROGFlNS9zamlxa0VjWlJjMTdWYVgxWjVVaQpvcGZnNW9SY05VTG9VTHNiek9aNTR0YlVDUmdSV2VLbGZxaElINEZ6OUlkVlUyR3dFdEdhMmV6TjgyMVBaQ3QzCjZhbVRIelJsQWdNQkFBRUNnZ0VBWTFGTUlLNDVXTkVNUHJ6RTZUY3NNdVV2RkdhQVZ4bVk5NW5SMEtwajdvb3IKY21CVys2ZXN0TTQ4S1AwaitPbXd3VFpMY29Cd3VoWGN0V1Bob1lXcDhteWUxRUlEdjNyaHRHMDdocEQ1NGg2dgpCZzh3ejdFYStzMk9sT0N6UnlKNzBSY281YlhjWDNGaGJjdnFlRWJwaFFyQnpOSEtLMjZ4cmZqNWZIT3p6T1FGCmJHdUZ3SDVic3JGdFhlajJXM3c4eW90N0ZQSDV3S3RpdnhvSWU5RjMyOXNnOU9EQnZqWnpiaG1LVTArckFTK1kKRGVield2bFJyaEUrbXVmQTN6M0N0QXhDOFJpNzNscFNoTDRQQWlvcG1SUXlxZXRXMjYzOFFxcnM0R3hnNzhwbApJUXJXTmNBc2s3Slg5d3RZenV6UFBXSXRWTTFscFJiQVRhNTJqdFl2NVFLQmdRRE5tMTFtZTRYam1ZSFV2cStZCmFTUzdwK2UybXZEMHVaOU9JeFluQnBWMGkrckNlYnFFMkE1Rm5hcDQ5Yld4QTgwUElldlVkeUpCL2pUUkoxcVMKRUpXQkpMWm1LVkg2K1QwdWw1ZUtOcWxFTFZHU0dCSXNpeE9SUXpDZHBoMkx0UmtBMHVjSVUzY3hiUmVMZkZCRQpiSkdZWENCdlNGcWd0VDlvZTFldVpMVmFOd0tCZ1FERWdENzJENk81eGIweEQ1NDQ1M0RPMUJhZmd6aThCWDRTCk1SaVd2LzFUQ0w5N05sRWtoeXovNmtQd1owbXJRcE5CMzZFdkpKZFVteHdkU2MyWDhrOGcxMC85NVlLQkdWQWoKL3d0YVZYbE9WeEFvK0ZSelpZeFpyQ29uWWFSMHVwUzFybDRtenN4REhlZU9mUVZUTUgwUjdZN0pnbTA5dXQ4SwplanAvSXZBb1F3S0JnQjNaRWlRUWhvMVYrWjBTMlpiOG5KS0plMy9zMmxJTXFHM0ZkaS9RS3Q0eWViQWx6OGY5ClBZVXBzRmZEQTg5Z3grSU1nSm5sZVptdTk2ZnRXSjZmdmJSenllN216TG5zZU05TXZua1lHbGFGWmJRWnZubXMKN3ZoRmtzY3dHRlh4d21GMlBJZmU1Z3pNMDRBeVdjeTFIaVhLS2dNOXM3cGsxWUdyZGowZzdacmRBb0dCQUtLNApDR3MrbkRmMEZTMFJYOWFEWVJrRTdBNy9YUFhtSG5YMkRnU1h5N0Q4NTRPaWdTTWNoUmtPNTErbVNJejNQbllvCk41T1FXM2lHVVl1M1YvYmhnc0VSUzM1V2xmRk9BdDBzRUR5bjF5SVdXcDF5dG93d3BUNkVvUXVuZ2NYZjA5RjMKS1NROXowd3M4VmsvRWkvSFVXcU5LOWFXbU51cmFaT0ZqL2REK1ZkOUFvR0FMWFN3dEE3K043RDRkN0VEMURSRQpHTWdZNVd3OHFvdDZSdUNlNkpUY0FnU3B1MkhNU3JVY2dXclpiQnJZb09FUnVNQjFoMVJydk5ybU1qQlM0VW9FClgyZC8vbGhpOG1wL2VESWN3UDNRa2puanBJRFJWMFN1eWxrUkVaZURKZjVZb3R6eDdFdkJhbzFIbkQrWEg4eUIKVUtmWGJTaHZKVUdhRmgxT3Q1Y3JoM1k9Ci0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K
491+
- apiVersion: v1
492+
kind: Secret
493+
metadata:
494+
namespace: envoy-gateway-system
495+
name: global-backend-client-cert
496+
type: kubernetes.io/tls
497+
data:
498+
tls.crt: YQ==
499+
tls.key: Yg==
316500
configmaps:
317501
- apiVersion: v1
318502
kind: ConfigMap

0 commit comments

Comments
 (0)