A Ziti controller configured without an alternative DNS, as per the helm chart values below, works as expected:
clientApi:
advertisedHost: "ziti-api.mydomain.com"
advertisedPort: 443
ingress:
enabled: false
service:
type: ClusterIP
traefikTcpRoute:
enabled: true
webBindingPki:
enabled: false
Adding an alternative DNS name as below breaks the connection from a Linux tunneler:
clientApi:
advertisedHost: "ziti-api.mydomain.com"
advertisedPort: 443
altDnsNames:
- "ziti-web.mydomain.com"
ingress:
enabled: false
service:
type: ClusterIP
traefikTcpRoute:
enabled: true
webBindingPki:
enabled: true
altServerCerts:
- mode: certManager
secretName: ziti-controller-trusted-cert
altDnsNames:
- "ziti-web.mydomain.com"
issuerRef:
group: cert-manager.io
kind: ClusterIssuer
name: letsencrypt-prod
mountPath: /etc/ziti/trusted-cert
In order for the tunneler to work, I have to reconfigure it to use the alternate DNS and add the Let's Encrypt root CA to the config file. I was expecting the connection to the advertizedHost to continue working.
Here's the output of the error log:
(4011277)[ 0.009] INFO ziti-sdk:ziti.c:512 ziti_start_internal() ztx[1] enabling Ziti Context
(4011277)[ 0.009] INFO ziti-sdk:ziti.c:528 ziti_start_internal() ztx[1] using tlsuv[v1.7.12/OpenSSL 3.4.2 1 Jul 2025]
(4011277)[ 0.009] INFO ziti-sdk:ziti_ctrl.c:637 ziti_ctrl_init() ctrl[https://ziti-api.mydomain.com:443/] controller initialized
(4011277)[ 0.009] INFO ziti-sdk:ziti.c:606 ztx_init_controller() ztx[1] Loading ziti context with controller[https://ziti-api.mydomain.com:443/]
(4011277)[ 0.468] ERROR tlsuv:engine.c:868 openssl: handshake was terminated: SSL routines
(4011277)[ 0.468] ERROR tlsuv:tls_link.c:113 TLS(0x1babf120) handshake error certificate verify failed
(4011277)[ 0.468] ERROR tlsuv:http.c:192 handshake failed status[3]: certificate verify failed
(4011277)[ 0.468] WARN ziti-sdk:ziti_ctrl.c:177 ctrl_resp_cb() ctrl[https://ziti-api.mydomain.com:443/] request failed: -103(software caused connection abort)
(4011277)[ 0.468] WARN ziti-sdk:ziti_ctrl.c:336 internal_version_cb() ctrl[https://ziti-api.mydomain.com:443/] CONTROLLER_UNAVAILABLE(software caused connection abort)
(4011277)[ 0.468] WARN ziti-sdk:ziti.c:2042 version_pre_auth_cb() ztx[1] failed to get controller version: CONTROLLER_UNAVAILABLE/software caused connection abort
(4011277)[ 0.468] WARN ziti-sdk:ziti_ctrl.c:177 ctrl_resp_cb() ctrl[https://ziti-api.mydomain.com:443/] request failed: -103(software caused connection abort)
(4011277)[ 0.468] INFO ziti-sdk:ziti_ctrl.c:180 ctrl_resp_cb() ctrl[https://ziti-api.mydomain.com:443/] attempting to switch endpoint
(4011277)[ 0.468] WARN ziti-sdk:ziti_ctrl.c:602 ctrl_next_ep() ctrl[https://ziti-api.mydomain.com:443/] no controllers are online
(4011277)[ 0.468] WARN ziti-sdk:ziti.c:643 ext_jwt_singers_cb() ztx[1] failed to get external auth providers: software caused connection abort
(4011277)[ 5.880] ERROR tlsuv:engine.c:868 openssl: handshake was terminated: SSL routines
(4011277)[ 5.880] ERROR tlsuv:tls_link.c:113 TLS(0x1babf120) handshake error certificate verify failed
(4011277)[ 5.880] ERROR tlsuv:http.c:192 handshake failed status[3]: certificate verify failed
I'll gladly log an issue, but before I do, I want to make sure my configuration is correct.