For the complete documentation index, see llms.txt. Markdown versions of all docs pages are available by appending .md to any docs URL.
SPIFFE trust domain chain verification
Enable strict mode to require that the mTLS certificate chain attests the peer’s SPIFFE trust domain.
This setting blocks trust domain spoofing when multiple intermediate authorities share a common root of trust.
About SPIFFE trust domain chain verification
Note
This feature requires your mesh to be installed with the Solo distribution of Istio and an Enterprise-level license for Solo Enterprise for Istio. Contact your account representative to obtain a valid license.
By default, ztunnel validates only that a peer certificate is rooted in a trust anchor from the mesh trust bundle. When multiple intermediate authorities share a common root, a workload in one trust domain could present a certificate that chains to the shared root but claims a different trust domain. Without chain verification, ztunnel accepts such a certificate as valid for the declared trust domain.
With VALIDATE_SPIFFE_TRUST_DOMAIN_NAMES=STRICT, ztunnel adds an additional check during the mTLS handshake. For each connection, ztunnel walks the verified certificate chain from the direct parent to the trust anchor, and requires at least one ancestor certificate to carry a Subject Alternative Name (SAN) that matches the trust domain declared in the leaf SPIFFE URI. The check applies to both inbound and outbound connections.
SAN matching rules
An ancestor SAN matches the leaf trust domain using the following rules.
DNS SANs:
| SAN form | Example | Matches trust domain |
|---|---|---|
| Exact | example.org | example.org only |
| Leading-dot suffix | .example.org | td.example.org, a.b.example.org, and any subdomain |
| Single-label wildcard | *.example.org | td.example.org but not a.b.example.org |
URI SANs:
- A SPIFFE URI SAN (for example,
spiffe://example.orgorspiffe://example.org/ns/istio-system/sa/istiod) matches when the URI authority component equals the trust domain. Matching is case-insensitive. - Non-SPIFFE URI SANs, such as CRL distribution point URLs, are skipped rather than rejected.
- A malformed SPIFFE URI (for example,
spiffe://with no authority) in any chain certificate causes the connection to be rejected immediately, even when a later certificate in the chain would have matched.
Before you begin
Configure a plugged-in CA whose intermediate certificates carry DNS SANs or URI SANs that cover the mesh trust domain. STRICT mode walks the verified certificate chain and rejects connections when no ancestor certificate has a matching SAN. The default Istio self-signed CA does not add trust domain SANs to its issued certificates. Enabling STRICT mode with a self-signed CA causes ztunnel to reject all connections.
Enable trust domain chain verification
Enable STRICT mode on the ztunnel.
helm upgrade ztunnel oci://us-docker.pkg.dev/soloio-img/istio-helm/ztunnel \ --version 1.30.3-solo \ --namespace istio-system \ --reuse-values \ --set env.VALIDATE_SPIFFE_TRUST_DOMAIN_NAMES=STRICTVerify that the ztunnel DaemonSet is running.
kubectl -n istio-system rollout status daemonset/ztunnelConfirm that existing connections between workloads still succeed. A connection failure at this stage indicates that your CA intermediates do not carry SANs that match the mesh trust domain. Reconfigure your CA to issue intermediate certificates with DNS SANs or SPIFFE URI SANs that cover the trust domain, then re-enable STRICT mode.