Manage trust bundles
What you’ll accomplish
Section titled “What you’ll accomplish”You’ll configure UDS Core to distribute custom CA certificates across your cluster, enabling platform components and your applications to trust private PKI, DoD CAs, or a curated set of public CAs.
Prerequisites
Section titled “Prerequisites”- UDS CLI installed
- Access to a Kubernetes cluster with UDS Core deployed
- Your CA certificate bundle in PEM format
Before you begin
Section titled “Before you begin”UDS Core provides a centralized trust bundle system that automatically builds and distributes certificate trust bundles. When configured, UDS Core:
- Creates
uds-trust-bundleConfigMaps in every namespace that contains a UDS Package CR - Syncs the bundle to
istio-systemfor JWKS fetching - Injects the bundle into Authservice for OIDC TLS verification
- Auto-mounts the bundle into platform components (Keycloak, Grafana, Loki, Vector, Velero, Prometheus, Alertmanager, Falcosidekick)
-
Configure the cluster trust bundle
Set the trust bundle variables in your
uds-config.yaml:uds-config.yaml variables:core:CA_BUNDLE_CERTS: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t..." # Base64-encoded PEM bundleCA_BUNDLE_INCLUDE_DOD_CERTS: "true" # Include DoD CA certificates (default: false)CA_BUNDLE_INCLUDE_PUBLIC_CERTS: "true" # Include curated public CAs (default: false)The three sources are concatenated into a single PEM bundle:
Variable Source When to use CA_BUNDLE_CERTSYour custom CA certificates If using private PKI (include domain CA at a minimum) CA_BUNDLE_INCLUDE_DOD_CERTSDoD CA certificates packaged with UDS Core When using DoD PKI or external services CA_BUNDLE_INCLUDE_PUBLIC_CERTSCurated US-based public CAs from the Mozilla CA store When applications need to reach public HTTPS endpoints in addition to the above Create and deploy your UDS Core bundle to apply the trust bundle configuration:
Terminal window uds create --confirm && uds deploy uds-bundle-*.tar.zst --confirm -
Customize trust bundle distribution for a package
Trust bundle ConfigMaps are automatically created in all namespaces with a UDS Package CR. To customize the ConfigMap for a specific package, use the
caBundlefield:uds-package.yaml apiVersion: uds.dev/v1alpha1kind: Packagemetadata:name: my-packagenamespace: my-packagespec:caBundle:configMap:name: uds-trust-bundle # default: uds-trust-bundlekey: ca-bundle.pem # default: ca-bundle.pemlabels:uds.dev/pod-reload: "true" # enable pod reloads when the bundle changesannotations:uds.dev/pod-reload-selector: "app=my-app" # only reload pods matching this selector -
Mount the trust bundle in your application
Platform components (Keycloak, Grafana, Loki, etc.) automatically mount the trust bundle — no manual configuration needed. For your own applications, mount the
uds-trust-bundleConfigMap as a volume.Choose the mount approach based on your needs:
Many Go-based applications check the
/etc/ssl/certs/directory for additional CAs alongside the system bundle. This adds your private CAs without replacing the system CAs:spec:containers:- name: my-appvolumeMounts:- name: ca-certsmountPath: /etc/ssl/certs/ca.pemsubPath: ca-bundle.pemreadOnly: truevolumes:- name: ca-certsconfigMap:name: uds-trust-bundleReplaces the entire system CA bundle. Your bundle must include both your private CAs and any public CAs the application needs:
spec:containers:- name: my-appvolumeMounts:- name: ca-certs# Debian/Ubuntu:mountPath: /etc/ssl/certs/ca-certificates.crt# RedHat/CentOS:# mountPath: /etc/pki/tls/certs/ca-bundle.crtsubPath: ca-bundle.pemreadOnly: truevolumes:- name: ca-certsconfigMap:name: uds-trust-bundle -
Deploy your application
(Recommended) Include the volume mount configuration and Package CR in your application’s Zarf package alongside your Helm chart and create/deploy. See Packaging applications for general packaging guidance.
Terminal window uds zarf package create --confirmuds zarf package deploy zarf-package-*.tar.zst --confirmOr apply the Package CR directly for quick testing (along with your updated application with mount):
Terminal window uds zarf tools kubectl apply -f uds-package.yaml
Verification
Section titled “Verification”Confirm trust bundles are distributed:
# Check that the trust bundle ConfigMap exists in your namespaceuds zarf tools kubectl get configmap uds-trust-bundle -n <namespace>
# View the ConfigMap contents (should show PEM-formatted certificates)uds zarf tools kubectl get configmap uds-trust-bundle -n <namespace> -o jsonpath='{.data.ca-bundle\.pem}' | head -5Verify that the ConfigMap contains PEM-formatted certificate data starting with -----BEGIN CERTIFICATE-----.
To confirm that platform components are using the trust bundle, check that services like Keycloak (https://sso.<domain>) and Grafana (https://grafana.<admin_domain>) can be accessed without TLS errors.
Troubleshooting
Section titled “Troubleshooting”Problem: Trust bundle ConfigMap not appearing in namespace
Section titled “Problem: Trust bundle ConfigMap not appearing in namespace”Symptom: The uds-trust-bundle ConfigMap does not exist in your application’s namespace.
Solution: The ConfigMap is only created in namespaces that contain a UDS Package CR. Verify a Package CR exists:
uds zarf tools kubectl get packages -n <namespace>If no Package CR exists, create one for your application. See the Package CR reference for details.
Problem: Application still rejects TLS connections
Section titled “Problem: Application still rejects TLS connections”Symptom: Your application returns certificate verification errors despite the trust bundle being mounted.
Solution:
- Verify the mount path is correct for your container’s base image (Debian vs RedHat)
- Check if your application uses a language-specific trust store (Java
cacerts, Pythoncertifi, Node.jsNODE_EXTRA_CA_CERTS) - Confirm the CA bundle contains the full certificate chain (including intermediate CAs)
- Verify the volume mount exists on the pod:
uds zarf tools kubectl get pod <pod-name> -n <namespace> -o jsonpath='{.spec.containers[0].volumeMounts}' | jq .Related Documentation
Section titled “Related Documentation”- Package CR specification — full Package CR schema including
caBundlefields - Java Keytool documentation — managing Java
cacertstrust stores - Python certifi — Python’s default CA bundle and how to override it
- Node.js
NODE_EXTRA_CA_CERTS— adding extra CAs for Node.js applications
Next steps
Section titled “Next steps”These guides and concepts may be useful to explore next: