Files
helm-charts-hardened/charts/spire-identity-exchange
Kevin Fox 3b4e7a1bd3 Bump spire-lib and dependent Helm Chart versions (patch)
* ab5e5d86 fix(spiffe-oidc-discovery-provider): run under restricted PSA/SCC on OpenShift (#920)

Signed-off-by: Kevin Fox <[email protected]>
2026-08-23 00:11:20 -07:00
..
2026-08-21 12:23:46 -07:00
2026-08-21 12:23:46 -07:00

spire-identity-exchange

Version: 0.2.1 Type: application AppVersion: v0.5.0

A Helm chart to install the SPIRE Identity Exchange.

Homepage: https://github.com/spiffe/helm-charts-hardened/tree/main/charts/spire-identity-exchange

Maintainers

Name Email Url
marcofranssen [email protected] https://marcofranssen.nl
kfox1111 [email protected]
faisal-memon [email protected]

Source Code

Listeners

Serving is a two-axis matrix: protocol (gRPC or REST) crossed with the source of the certificate the listener presents. All four listeners are independent and can run at once.

Values block Serves with Default port Default
tls.rest the certificate from tls.externalSecret / tls.certManager 8444 off
tls.grpc the certificate from tls.externalSecret / tls.certManager 8443 off
spiffe.rest this deployment's own X509-SVID 8544 on
spiffe.grpc this deployment's own X509-SVID 8543 off

The spiffe.* listeners need no certificate files: the SVID is fetched from the SPIRE Agent Workload API and rotated automatically, so a SPIFFE-only install requires neither cert-manager nor a TLS Secret. A cert source under tls: is required only when tls.rest or tls.grpc is enabled. Client authentication is identical on all four — callers present a bearer token.

With tls.certManager, the requested certificate's dnsNames are taken from whichever exposures are enabled — the ingress.host, the gatewayAPI.host, or both — across every enabled tls.* listener, deduplicated. Each enabled tls.* listener must therefore have an ingress or a gateway enabled, unless you set tls.certManager.certificate.dnsNames explicitly.

The stack selector

Every exchange addresses a stack: an entry in auth.stacks, or — with auth.passthroughPlugins (the default) — a single plugin addressed under its own name. It is the {stack} segment of the REST path (/api/v1/svid/{stack}/x509).

As of app version v0.4.0 the exchange asserts one selector on its own behalf, naming the stack that was addressed:

Selector type Value Example
spire_identity_exchange stack:name:<stack> spire_identity_exchange:stack:name:k8s_psat

Add it to a registration entry to scope that entry to a single stack:

controllerManager:
  identities:
    clusterStaticEntries:
      test:
        selectors:
          - k8s_psat:namespace:default
          - k8s_psat:service_account_name:default
          - spire_identity_exchange:stack:name:k8s_psat   # only issuable via this stack

Parameters

Chart parameters

Name Description Value
agentSocketName The name of the spire-agent unix socket spire-agent.sock
csiDriverName The csi driver to use csi.spiffe.io
replicaCount Replica count 1
namespaceOverride Namespace override ""
annotations Annotations for the deployment {}
labels Labels for the deployment {}
image.registry The OCI registry to pull the image from ghcr.io
image.repository The repository within the registry spiffe/spire-identity-exchange-server
image.pullPolicy The image pull policy IfNotPresent
image.tag Overrides the image tag whose default is the chart appVersion ""
spireAgent.resources Resource requests and limits {}
spireAgent.image.registry The OCI registry to pull the image from ghcr.io
spireAgent.image.repository The repository within the registry spiffe/spire-agent
spireAgent.image.pullPolicy The image pull policy IfNotPresent
spireAgent.image.tag Overrides the image tag whose default is the chart appVersion 1.15.3
extraEnv Extra environment variables to add to the spire identity exchange []
resources Resource requests and limits {}
configMap.annotations Annotations to add to the SPIRE Identity Exchange ConfigMap {}
podSecurityContext Pod security context for SPIRE Identity Exchange pods {}
securityContext Security context for SPIRE Identity Exchange deployment {}
readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe 5
readinessProbe.periodSeconds Period seconds for readinessProbe 5
livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe 5
livenessProbe.periodSeconds Period seconds for livenessProbe 5
podAnnotations Pod annotations for SPIRE Identity Exchange {}
podLabels Labels to add to pods {}
config.logLevel The log level, valid values are "debug", "info", "warn", and "error" info
config.logFormat The log format, valid values are "text" and "json" text
telemetry.prometheus.port Port for prometheus metrics 4950
telemetry.prometheus.podMonitor.enabled Enable podMonitor for prometheus false
telemetry.prometheus.podMonitor.namespace Override where to install the podMonitor, if not set will use the same namespace as the helm release ""
telemetry.prometheus.podMonitor.labels Pod labels to filter for prometheus monitoring {}
imagePullSecrets Image pull secret names []
nameOverride Name override ""
fullnameOverride Full name override ""
serviceAccount.create Specifies whether a service account should be created true
serviceAccount.annotations Annotations to add to the service account {}
serviceAccount.name The name of the service account to use. If not set and create is true, a name is generated. ""
deleteHook.enabled Enable Helm hooks to autofix common delete issues (should be disabled when using helm template) true
autoscaling.enabled Flag to enable autoscaling false
autoscaling.minReplicas Minimum replicas for autoscaling 1
autoscaling.maxReplicas Maximum replicas for autoscaling 5
autoscaling.targetCPUUtilizationPercentage Target CPU utlization that triggers autoscaling 80
autoscaling.targetMemoryUtilizationPercentage Target Memory utlization that triggers autoscaling 80
nodeSelector Node selector {}
tolerations list of tolerations []
affinity Node affinity {}
trustDomain Set the trust domain to be used for the SPIFFE identifiers example.org
clusterName The name of this Kubernetes cluster, as it appears in SPIFFE ID paths example-cluster
jwtIssuer The issuer URL for JWT-SVIDs. Defaults to https://oidc-discovery.$trustDomain ""
clusterDomain The name of the Kubernetes cluster (kubeadm init --service-dns-domain) cluster.local
auth.plugins.k8s_psat.enabled Enable the k8s psat plugin true
auth.plugins.k8s_psat.config.audiences The audiences to allow []
auth.plugins.k8s_psat.config.allowedServiceAccounts The service accounts that are allowed []
auth.plugins.spiffe.enabled Enable the spiffe plugin true
auth.plugins.spiffe.keySource What source to use to fetch the keys. Can be oidc or oidcLocal. oidcLocal forces discoveryURL to be the internal discovery address. oidcLocal
auth.plugins.spiffe.csiDriverName The CSI driver providing the SPIRE Agent workload socket this plugin attests against. Defaults to the chart level csiDriverName. Requires config.connectWithTrustBundle.
auth.plugins.spiffe.config.issuerURL The url to connect to for JWKS discovery ${SPIFFE_JWT_ISSUER}
auth.plugins.spiffe.config.trustDomain The trust domain to use ${SPIFFE_TRUST_DOMAIN}
auth.plugins.spiffe.config.pathPatterns The service accounts that are allowed []
auth.plugins.spiffe.config.audiences The audiences to allow []
auth.plugins.spiffe.config.connectWithTrustBundle Use the trust bundle to validate the issuerURL true
auth.stacks.image_pull.enabled Enable the image_pull stack true
auth.stacks.image_pull.plugins List of plugins that are required by this stack []
auth.unsupportedBuiltInPlugins Unsupported mechanism to use plugins not yet supported by the chart. {}
auth.passthroughPlugins Address each plugin as a stack of its own, in addition to any stacks defined false
tls.externalSecret.enabled Provide your own certificate/key via tls style Kubernetes Secret false
tls.externalSecret.secretName Specify which Secret to use ""
tls.certManager.enabled Use certificateManager to create the certificate false
tls.certManager.issuer.create Create an issuer to use to issue the certificate true
tls.certManager.issuer.acme.email Must be set in order to register with LetsEncrypt. By setting, you agree to their Terms of Service ""
tls.certManager.issuer.acme.server Server to use to get certificate. Defaults to LetsEncrypt https://acme-v02.api.letsencrypt.org/directory
tls.certManager.issuer.acme.solvers Configure the issuer solvers. Defaults to http01 via ingress. {}
tls.certManager.certificate.dnsNames Override the dnsNames on the certificate request. Defaults to the same settings as Ingress []
tls.certManager.certificate.issuerRef.group If you are using an external plugin, specify the group for it here ""
tls.certManager.certificate.issuerRef.kind Kind of the issuer reference. Override if you want to use a ClusterIssuer Issuer
tls.certManager.certificate.issuerRef.name Name of the issuer to use. If unset, it will use the name of the built in issuer ""
tls.rest.enabled Enable the REST listener served with the certificate from disk false
tls.rest.port Container port for the REST listener served with the certificate from disk 8444
tls.rest.service.type Service type ClusterIP
tls.rest.service.port port for the service 443
tls.rest.service.annotations Annotations for service resource {}
tls.rest.service.loadBalancerIP IP address to assign to load balancer (if supported) ""
tls.rest.ingress.enabled Flag to enable ingress false
tls.rest.ingress.className Ingress class name ""
tls.rest.ingress.controllerType Specify what type of ingress controller you're using to add the necessary annotations accordingly. If blank, autodetection is attempted. If other, no annotations will be added. Must be one of [ingress-nginx, openshift, other, ""]. ""
tls.rest.ingress.annotations Annotations for ingress object {}
tls.rest.ingress.host Host name for the ingress. If no '.' in host, trustDomain is automatically appended. The rest of the rules will be autogenerated. For more customizability, use hosts[] instead. spire-identity-exchange-rest
tls.rest.ingress.tlsSecret Secret that has the certs. If blank will use default certs. Used with host var. ""
tls.rest.ingress.hosts Host paths for ingress object. If emtpy, rules will be built based on the host var. []
tls.rest.ingress.tls Secrets containining TLS certs to enable https on ingress. If emtpy, rules will be built based on the host and tlsSecret vars. []
tls.rest.gatewayAPI.enabled Flag to expose the endpoint via Gateway API false
tls.rest.gatewayAPI.host Host name for the route. If no '.' in host, trustDomain is automatically appended. spire-identity-exchange-rest
tls.rest.gatewayAPI.tlsSecret Secret with the TLS cert for edge termination. Blank keeps passthrough. ""
tls.rest.gatewayAPI.annotations Annotations for the route (and its ListenerSet) {}
tls.rest.gatewayAPI.listenerSet.enabled Manage a ListenerSet for this service's SNI listener. Null inherits global.spire.gatewayAPI.manageListenerSets. nil
tls.rest.gatewayAPI.parentRefs parentRefs used when ListenerSet management is disabled (direct attach) []
tls.rest.gatewayAPI.sectionName Listener sectionName override when attaching directly to a Gateway ""
tls.rest.gatewayAPI.backendTLS.caCertificateRefs ConfigMap refs holding the backend CA used to validate the re-encrypted connection. Defaults to the SPIRE bundle configmap. []
tls.grpc.enabled Enable the gRPC listener served with the certificate from disk false
tls.grpc.port Container port for the gRPC listener served with the certificate from disk 8443
tls.grpc.service.type Service type ClusterIP
tls.grpc.service.port port for the service 443
tls.grpc.service.annotations Annotations for service resource {}
tls.grpc.service.loadBalancerIP IP address to assign to load balancer (if supported) ""
tls.grpc.ingress.enabled Flag to enable ingress false
tls.grpc.ingress.className Ingress class name ""
tls.grpc.ingress.controllerType Specify what type of ingress controller you're using to add the necessary annotations accordingly. If blank, autodetection is attempted. If other, no annotations will be added. Must be one of [ingress-nginx, openshift, other, ""]. ""
tls.grpc.ingress.annotations Annotations for ingress object {}
tls.grpc.ingress.host Host name for the ingress. If no '.' in host, trustDomain is automatically appended. The grpc of the rules will be autogenerated. For more customizability, use hosts[] instead. spire-identity-exchange-grpc
tls.grpc.ingress.tlsSecret Secret that has the certs. If blank will use default certs. Used with host var. ""
tls.grpc.ingress.hosts Host paths for ingress object. If emtpy, rules will be built based on the host var. []
tls.grpc.ingress.tls Secrets containining TLS certs to enable https on ingress. If emtpy, rules will be built based on the host and tlsSecret vars. []
tls.grpc.gatewayAPI.enabled Flag to expose the endpoint via Gateway API false
tls.grpc.gatewayAPI.host Host name for the route. If no '.' in host, trustDomain is automatically appended. spire-identity-exchange-grpc
tls.grpc.gatewayAPI.tlsSecret Secret with the TLS cert for edge termination. Blank keeps passthrough. ""
tls.grpc.gatewayAPI.annotations Annotations for the route (and its ListenerSet) {}
tls.grpc.gatewayAPI.listenerSet.enabled Manage a ListenerSet for this service's SNI listener. Null inherits global.spire.gatewayAPI.manageListenerSets. nil
tls.grpc.gatewayAPI.parentRefs parentRefs used when ListenerSet management is disabled (direct attach) []
tls.grpc.gatewayAPI.sectionName Listener sectionName override when attaching directly to a Gateway ""
tls.grpc.gatewayAPI.backendTLS.caCertificateRefs ConfigMap refs holding the backend CA used to validate the re-encrypted connection. Defaults to the SPIRE bundle configmap. []
spiffe.rest.enabled Enable the REST listener served with this deployment's own X509-SVID true
spiffe.rest.port Container port for the REST listener served with this deployment's own X509-SVID 8544
spiffe.rest.service.type Service type ClusterIP
spiffe.rest.service.port port for the service 443
spiffe.rest.service.annotations Annotations for service resource {}
spiffe.rest.service.loadBalancerIP IP address to assign to load balancer (if supported) ""
spiffe.rest.ingress.enabled Flag to enable ingress false
spiffe.rest.ingress.className Ingress class name ""
spiffe.rest.ingress.controllerType Specify what type of ingress controller you're using to add the necessary annotations accordingly. If blank, autodetection is attempted. If other, no annotations will be added. Must be one of [ingress-nginx, openshift, other, ""]. ""
spiffe.rest.ingress.annotations Annotations for ingress object {}
spiffe.rest.ingress.host Host name for the ingress. If no '.' in host, trustDomain is automatically appended. The rest of the rules will be autogenerated. For more customizability, use hosts[] instead. spire-identity-exchange-rest-spiffe
spiffe.rest.ingress.tlsSecret Secret that has the certs. If blank will use default certs. Used with host var. ""
spiffe.rest.ingress.hosts Host paths for ingress object. If emtpy, rules will be built based on the host var. []
spiffe.rest.ingress.tls Secrets containining TLS certs to enable https on ingress. If emtpy, rules will be built based on the host and tlsSecret vars. []
spiffe.rest.gatewayAPI.enabled Flag to expose the endpoint via Gateway API false
spiffe.rest.gatewayAPI.host Host name for the route. If no '.' in host, trustDomain is automatically appended. spire-identity-exchange-rest-spiffe
spiffe.rest.gatewayAPI.annotations Annotations for the route (and its ListenerSet) {}
spiffe.rest.gatewayAPI.listenerSet.enabled Manage a ListenerSet for this service's SNI listener. Null inherits global.spire.gatewayAPI.manageListenerSets. nil
spiffe.rest.gatewayAPI.parentRefs parentRefs used when ListenerSet management is disabled (direct attach) []
spiffe.rest.gatewayAPI.sectionName Listener sectionName override when attaching directly to a Gateway ""
spiffe.grpc.enabled Enable the gRPC listener served with this deployment's own X509-SVID false
spiffe.grpc.port Container port for the gRPC listener served with this deployment's own X509-SVID 8543
spiffe.grpc.service.type Service type ClusterIP
spiffe.grpc.service.port port for the service 443
spiffe.grpc.service.annotations Annotations for service resource {}
spiffe.grpc.service.loadBalancerIP IP address to assign to load balancer (if supported) ""
spiffe.grpc.ingress.enabled Flag to enable ingress false
spiffe.grpc.ingress.className Ingress class name ""
spiffe.grpc.ingress.controllerType Specify what type of ingress controller you're using to add the necessary annotations accordingly. If blank, autodetection is attempted. If other, no annotations will be added. Must be one of [ingress-nginx, openshift, other, ""]. ""
spiffe.grpc.ingress.annotations Annotations for ingress object {}
spiffe.grpc.ingress.host Host name for the ingress. If no '.' in host, trustDomain is automatically appended. The grpc of the rules will be autogenerated. For more customizability, use hosts[] instead. spire-identity-exchange-grpc-spiffe
spiffe.grpc.ingress.tlsSecret Secret that has the certs. If blank will use default certs. Used with host var. ""
spiffe.grpc.ingress.hosts Host paths for ingress object. If emtpy, rules will be built based on the host var. []
spiffe.grpc.ingress.tls Secrets containining TLS certs to enable https on ingress. If emtpy, rules will be built based on the host and tlsSecret vars. []
spiffe.grpc.gatewayAPI.enabled Flag to expose the endpoint via Gateway API false
spiffe.grpc.gatewayAPI.host Host name for the route. If no '.' in host, trustDomain is automatically appended. spire-identity-exchange-grpc-spiffe
spiffe.grpc.gatewayAPI.annotations Annotations for the route (and its ListenerSet) {}
spiffe.grpc.gatewayAPI.listenerSet.enabled Manage a ListenerSet for this service's SNI listener. Null inherits global.spire.gatewayAPI.manageListenerSets. nil
spiffe.grpc.gatewayAPI.parentRefs parentRefs used when ListenerSet management is disabled (direct attach) []
spiffe.grpc.gatewayAPI.sectionName Listener sectionName override when attaching directly to a Gateway ""
tools.kubectl.image.registry The OCI registry to pull the image from registry.k8s.io
tools.kubectl.image.repository The repository within the registry kubectl
tools.kubectl.image.pullPolicy The image pull policy IfNotPresent
tools.kubectl.image.tag Overrides the image tag whose default is the chart appVersion ""
clusterRole.create create a k8s cluster role to allow access to token reviews and oidc discovery true
server.address Address for Spire server ""
server.port Port number for Spire server 443
server.namespaceOverride Override the namespace for Spire server ""
server.nameOverride Override the name for Spire server. Should only be changed when building your own nested chart to ensure names align. ""