Skip to content

Commit f865cfe

Browse files
committed
refactor: split EAP server cert into its own K8s secret
eap.crt/eap.key move from the radsec-server-certificates secret into a dedicated eap-server-cert secret. The RadSec cert secret holds outer- tunnel material (tls.crt, tls.key, ca.pem, wifi-ca.pem) verified by routers; the EAP cert secret holds what iOS devices verify during EAP-TLS. Mixing them in one secret named radsec-server-certificates was confusing. The FreeRADIUS pod mounts both secrets at /etc/pint/radsec via a projected volume, so no cert paths change in the EAP config.
1 parent bf9bddb commit f865cfe

9 files changed

Lines changed: 31 additions & 11 deletions

File tree

chart/templates/_helpers.tpl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ never collide. Each can be overridden via the corresponding values key.
6666
{{- .Values.secrets.deviceMap | default (printf "%s-device-map" (include "pint.fullname" .)) }}
6767
{{- end }}
6868

69+
{{- define "pint.secretName.eapCert" -}}
70+
{{- .Values.secrets.eapCert | default (printf "%s-eap-server-cert" (include "pint.fullname" .)) }}
71+
{{- end }}
72+
6973
{{- define "pint.envSecret" -}}
7074
{{- .Values.envSecret | default (include "pint.fullname" .) }}
7175
{{- end }}

chart/templates/deployment.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ spec:
9898
value: {{ include "pint.secretName.config" . | quote }}
9999
- name: PINT_RADSEC_CERT_SECRET
100100
value: {{ include "pint.secretName.radSecCert" . | quote }}
101+
- name: PINT_EAP_CERT_SECRET
102+
value: {{ include "pint.secretName.eapCert" . | quote }}
101103
- name: PINT_SCEP_RA_CERT_SECRET
102104
value: {{ include "pint.secretName.scepRACert" . | quote }}
103105
- name: PINT_DEVICE_MAP_SECRET

chart/templates/freeradius-deployment.yaml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,13 @@ spec:
4343
secretName: {{ include "pint.secretName.config" . }}
4444
optional: true
4545
- name: pint-radsec
46-
secret:
47-
secretName: {{ include "pint.secretName.radSecCert" . }}
46+
projected:
4847
defaultMode: 0444
48+
sources:
49+
- secret:
50+
name: {{ include "pint.secretName.radSecCert" . }}
51+
optional: true
52+
- secret:
53+
name: {{ include "pint.secretName.eapCert" . }}
54+
optional: true
4955
{{- end }}

chart/templates/role.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ rules:
1717
- {{ include "pint.secretName.scepRACert" . | quote }}
1818
- {{ include "pint.secretName.profileSigningCert" . | quote }}
1919
- {{ include "pint.secretName.deviceMap" . | quote }}
20+
- {{ include "pint.secretName.eapCert" . | quote }}
2021
verbs: ["get", "patch", "update"]
2122
- apiGroups: ["apps"]
2223
resources: ["deployments"]

chart/values.schema.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,10 @@
148148
"deviceMap": {
149149
"type": "string",
150150
"description": "Secret storing the cert serial to device info map. Defaults to '<fullname>-device-map'."
151+
},
152+
"eapCert": {
153+
"type": "string",
154+
"description": "Secret storing the FreeRADIUS EAP-TLS server cert and key (eap.crt, eap.key). Wireless CA-issued; verified by iOS devices via mobileconfig anchor. Defaults to '<fullname>-eap-server-cert'."
151155
}
152156
}
153157
},

chart/values.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ envSecret: ""
6464
secrets:
6565
config: "" # default: <fullname>-config (clients.json, clients.conf, status-secret, status)
6666
radSecCert: "" # default: <fullname>-radsec-server-certificates (tls.crt, tls.key, ca.pem, wifi-ca.pem)
67+
eapCert: "" # default: <fullname>-eap-server-cert (eap.crt, eap.key); wireless CA-issued, verified by iOS devices
6768
profileSigningCert: "" # default: <fullname>-profile-signing-cert (tls.crt, tls.key)
6869
scepRACert: "" # default: <fullname>-scep-ra-cert (tls.crt, tls.key); auto-generated on first startup
6970
deviceMap: "" # default: <fullname>-device-map (device-map.json); auto-created on first SCEP enrollment

cmd/pint/main.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,7 @@ func watchRadSecServerCert(log *zap.Logger, k8sClient kubernetes.Interface, ipaC
381381
// cert secret. If the cert is missing or within radSecRenewBefore of expiry, a new one is
382382
// issued from the wireless CA so that iOS devices can verify it via their mobileconfig anchor.
383383
func loadOrRenewEAPServerCert(ctx context.Context, log *zap.Logger, k8sClient kubernetes.Interface, ipaClient *freeipa.Client, cfg *config.Config) error {
384-
secret, err := k8sClient.CoreV1().Secrets(cfg.Namespace).Get(ctx, cfg.RadSecCertSecret, metav1.GetOptions{})
384+
secret, err := k8sClient.CoreV1().Secrets(cfg.Namespace).Get(ctx, cfg.EAPCertSecret, metav1.GetOptions{})
385385
if err == nil {
386386
existing := secret.Data["eap.crt"]
387387
key := secret.Data["eap.key"]
@@ -414,7 +414,7 @@ func loadOrRenewEAPServerCert(ctx context.Context, log *zap.Logger, k8sClient ku
414414
}
415415
newKeyPEM := pem.EncodeToMemory(&pem.Block{Type: "EC PRIVATE KEY", Bytes: ecKeyBytes})
416416

417-
if writeErr := radius.WriteEAPServerCert(ctx, k8sClient, cfg.Namespace, cfg.RadSecCertSecret, cfg.FreeRADIUSDeployment, newCertPEM, newKeyPEM); writeErr != nil {
417+
if writeErr := radius.WriteEAPServerCert(ctx, k8sClient, cfg.Namespace, cfg.EAPCertSecret, cfg.FreeRADIUSDeployment, newCertPEM, newKeyPEM); writeErr != nil {
418418
return fmt.Errorf("write eap cert: %w", writeErr)
419419
}
420420
log.Info("issued and stored new EAP server cert")

internal/config/config.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ type Config struct {
3535
// Kubernetes
3636
Namespace string
3737
ConfigSecret string // PINT_CONFIG_SECRET:K8s Secret holding clients.json, clients.conf, status-secret, and status config
38-
RadSecCertSecret string // PINT_RADSEC_CERT_SECRET:K8s Secret storing FreeRADIUS TLS cert+key
38+
RadSecCertSecret string // PINT_RADSEC_CERT_SECRET:K8s Secret storing FreeRADIUS outer RadSec TLS cert+key (tls.crt, tls.key, ca.pem, wifi-ca.pem)
39+
EAPCertSecret string // PINT_EAP_CERT_SECRET:K8s Secret storing FreeRADIUS EAP-TLS server cert+key (eap.crt, eap.key); wireless CA-issued
3940
FreeRADIUSDeployment string
4041

4142
// FreeRADIUS status virtual server
@@ -94,6 +95,7 @@ func Load() (*Config, error) {
9495
cfg.Namespace = optional("PINT_NAMESPACE", "pint")
9596
cfg.ConfigSecret = optional("PINT_CONFIG_SECRET", "pint-config")
9697
cfg.RadSecCertSecret = optional("PINT_RADSEC_CERT_SECRET", "pint-radsec-server-certificates")
98+
cfg.EAPCertSecret = optional("PINT_EAP_CERT_SECRET", "pint-eap-server-cert")
9799
cfg.FreeRADIUSDeployment = optional("PINT_FREERADIUS_DEPLOYMENT", "pint-freeradius")
98100
cfg.RadiusServer = require("PINT_RADIUS_SERVER")
99101
cfg.RADIUSStatusPort = optional("PINT_RADIUS_STATUS_PORT", "18121")

internal/radius/reload.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,13 @@ func WriteRadSecTLS(ctx context.Context, k8s kubernetes.Interface, namespace, se
4949
// WriteEAPServerCert writes the FreeRADIUS EAP-TLS server cert and key to the named K8s
5050
// Secret (eap.crt / eap.key) and triggers a FreeRADIUS rollout restart.
5151
// The EAP cert is issued by the wireless CA so that iOS devices can verify it using the
52-
// CA anchor embedded in their mobileconfig profile. This is separate from tls.crt / tls.key,
53-
// which is the outer RadSec TLS cert issued by the RadSec CA and verified by routers.
52+
// CA anchor embedded in their mobileconfig profile. This is separate from the RadSec cert
53+
// secret (tls.crt / tls.key), which is the outer RadSec TLS cert verified by routers.
5454
func WriteEAPServerCert(ctx context.Context, k8s kubernetes.Interface, namespace, secretName, deployment string, certPEM, keyPEM []byte) error {
55-
if err := patchSecretKey(ctx, k8s, namespace, secretName, "eap.crt", certPEM); err != nil {
56-
return err
57-
}
58-
if err := patchSecretKey(ctx, k8s, namespace, secretName, "eap.key", keyPEM); err != nil {
55+
if err := UpsertSecret(ctx, k8s, &corev1.Secret{
56+
ObjectMeta: metav1.ObjectMeta{Name: secretName, Namespace: namespace},
57+
Data: map[string][]byte{"eap.crt": certPEM, "eap.key": keyPEM},
58+
}); err != nil {
5959
return err
6060
}
6161
return Reload(ctx, k8s, namespace, deployment)

0 commit comments

Comments
 (0)