x509: certificate signed by unknown authority or unable to verify the first certificate.
To fix this, the CA bundle must be present in the trust store of every pod that opens the connection. TrueFoundry supports this in three scenarios.
This configuration is only needed for self-signed or internal CA certificates. Endpoints with certificates issued by a public CA are already trusted.
Control plane calling endpoints signed by a custom CA
Control plane components do not talk to each other over TLS — traffic between them is plain pod-to-pod communication inside the cluster. The control plane needs a custom CA when TrueFoundry services make outbound calls to endpoints that present a certificate signed by your private CA, such as model endpoints, integration provider endpoints, private registries, or corporate proxies. Set the CA in yourtruefoundry chart values:
truefoundry-values.yaml
ca-certificates.crt:
truefoundry-values.yaml
Compute plane connecting to the control plane
tfy-agent runs on the compute plane and connects to your control plane URL. If that URL serves a certificate signed by a private CA, or the traffic passes through a corporate TLS proxy, the agent needs the CA bundle.
Set the CA in your tfy-agent chart values. When enabled, the bundle is mounted into the tfyAgent, tfyAgentProxy, and sdsServer pods:
tfy-agent-values.yaml
tfy-agent after the control plane is reachable, so the agent can complete its first connection. See TFY Agent for the full agent configuration.
Workloads calling endpoints signed by a custom CA
Workloads deployed through TrueFoundry — services, jobs, notebooks, and LLM deployments — run from arbitrary container images in workspace namespaces. When these workloads call an endpoint that presents a certificate signed by your private CA, they need the CA bundle too, and no single Helm value covers images you do not build. TrueFoundry handles this with two Kyverno policies packaged in thetfy-kyverno-config chart:
Together they remove the need to rebuild images, patch pod specs, or distribute certificates by hand.
Prerequisites
- A compute plane cluster connected to your TrueFoundry control plane.
- Cluster admin access, because both policies are cluster-scoped resources.
- Kyverno installed on the cluster.
tfy-kyverno-configchart version0.1.10or later.- Your internal CA certificate in PEM format, referred to below as
custom-ca.crt.
1
Build the combined CA bundle
The bundle you distribute must contain the public CA certificates and your internal CA. If you ship only your internal CA, workloads lose trust for every public endpoint.Extract a current public bundle from a standard image:Check that your internal CA certificate is valid:Append it to the public bundle:
2
Create the CA bundle ConfigMap
Create the ConfigMap in a source namespace. The examples use the To update an existing ConfigMap, apply it instead:
truefoundry namespace and the ConfigMap name ca-cert-bundle, which is the chart default. The key must be ca-certificates.crt.3
Install Kyverno
4
Configure tfy-kyverno-config
Create the chart values:
kyverno-config-values.yaml
tfy-* matches the namespaces that TrueFoundry creates for workspaces. Adjust the include list if your workspaces use a different naming pattern, and add excludeNamespaces for namespaces that must be skipped.5
Deploy the chart
- TrueFoundry platform
- Helm CLI
Deploying from the platform records the chart version and change history, which makes later upgrades easier to track.
- In the TrueFoundry dashboard, go to Deployments and click New.
- Click Show advanced and select Helm.
- Choose Public Helm Repository as the chart source and fill in:
- Helm repository URL:
https://truefoundry.github.io/infra-charts - Chart name:
tfy-kyverno-config - Version: the chart version you want to pin
- Helm repository URL:
- Paste your values into the values editor and click Submit.
6
Verify the injection
Confirm both policies exist. You should see Confirm the ConfigMap was cloned into a workspace namespace:Deploy or restart a workload, then check the mount and the environment variables:Confirm the workload reaches an endpoint that uses your internal CA:
<release-name>-sync-configmaps and <release-name>-pod-volume-mounts:Policies created by the chart
The chart renders these manifests from your values. They are shown here so you can review what is applied to the cluster. ConfigMap sync:mountInitContainers is enabled:
Configuration reference
syncConfigMaps parameters
syncConfigMaps parameters
The generated policy sets
generateExisting: true and synchronize: true, so it populates namespaces that already exist as well as new ones, and propagates later changes to the source ConfigMap.podVolumeMounts parameters
podVolumeMounts parameters
Each entry in
mountDetails and additionalMountDetails accepts:For example, to mount a TLS Secret alongside the default CA bundle:
kyverno-config-values.yaml
Default mount and environment variables
Default mount and environment variables
When
mountDetails is empty, the chart mounts the CA bundle and sets the variables that most runtimes read:Some runtimes keep their own trust store and ignore these variables. For Node.js applications, add
NODE_EXTRA_CA_CERTS pointing at the same path. For Java applications, import the CA into the JVM truststore.Troubleshooting
Use these commands to narrow down where the injection stopped.
Check whether the sync policy ran and what it reported: