TTechclick ⚡ XP 0% All lessons
Zscaler · ZPA · App Connector DeploymentInteractive · L1 / L2 / L3

ZPA App Connector Deployment — Deploy, Enrol & Survive the Auto-Update

A ZPA App Connector is a tiny Linux VM that sits next to your apps and only ever dials out — but stand it up wrong and it shows Disconnected forever. This lesson deploys one for real: sizing and the static-MAC trap, the exact egress rules, the provisioning key as a secret, the mTLS enrolment handshake that NTP skew silently breaks, and the high-availability pair that survives its own auto-update.

📅 2026-06-03 · ⏱ 14 min · 3 live demos · 4 infographics · 🏷 10-Q assessment + AI Tutor inline

⚡ Quick Answer

Deploy a ZPA App Connector end-to-end — VM sizing and static MAC, outbound-only egress, provisioning keys, the mTLS enrolment handshake and the NTP clock-skew trap, plus high availability via staggered round-robin auto-update. 5 infographics, 2 live demos, real console recreations and a 10-question assessment.

🎯 By the end you will be able to

Read as:

Pick where you want to start

1

Size & place it

VM spec, supported Linux, and the static-MAC trap.

2

Egress rules

What to open outbound — and never SSL-inspect.

3

Key & enrol

The provisioning key and the mTLS handshake.

4

Make it HA

Two connectors that survive the auto-update.

🧠 Warm-up — 3 questions, no score

Just notice which ones make you pause. We answer all three inside the lesson.

1. What is the App Connector minimum spec?

Answered in Size & place it.

2. A new connector logs "certificate is not yet valid" — what is wrong?

Answered in Key & enrol.

3. Which inbound firewall port does an App Connector need open?

Answered in Egress rules.

Most engineers think…

An App Connector is basically a reverse proxy you publish — give it a public IP, open 443 inbound, and the cloud connects in to use it.

Wrong, and backwards. The connector never accepts a connection — it only ever dials OUT to the Zscaler cloud on 443. No public IP, no inbound NAT, no DMZ. Get that one fact and the egress rules, the enrolment handshake and HA all fall into place. The hard parts are not the network — they are the static MAC, the clock, and the provisioning key.

① The App Connector, sized and placed right

An App Connector is not a firewall, not a VPN concentrator, not a server you publish. It is a small Linux VM whose only job is to sit next to your apps, dial out to the Zscaler cloud, and proxy authorised sessions back to the real server. Get its size, its OS, and — the one everyone misses — its MAC address right, and the rest of this lesson is plumbing. Get them wrong and you will chase a ghost for a day.

The minimum spec is deliberately tiny: 2 vCPU, 4 GB RAM, 8 GB disk, on a supported 64-bit Linux — RHEL, CentOS, Oracle Linux or a Zscaler-provided OVA. Each connector pushes roughly 0.3 to 0.5 Gbps, so you scale by adding VMs, not by buying a bigger box. But the spec line that bites freshers is not CPU — it is identity: a pinned static MAC.

The MAC trap — why a clone or vMotion kills your connector

When a connector enrols, the ZPA cloud fingerprints it partly by its MAC address. Clone the VM, vMotion it to a host that re-randomises the NIC, or swap the virtual NIC, and the MAC changes — so the cloud sees a different machine, the old identity is gone, and the connector reads as broken. Pin a static MAC on the VM before you enrol it, and never template-clone a live connector — build each one fresh from the base image.

Placement is the other half of sizing. A connector goes near the app, not near the user. ZPA does latency-based selection — it routes a user to whichever connector in the group can reach the app fastest — so a connector sitting in the same data centre as your SAP box is what makes the session quick. Put one in every site/VPC that hosts apps; do not centralise them.

Four deployment facts to lock in first

Tap each card — front is the fact most freshers get wrong, back is the correction you will need all lesson.

🖥️
"Bigger VM = better"
tap to flip

No. The minimum is tiny — 2 vCPU / 4 GB / 8 GB. You scale by adding connectors (~0.3–0.5 Gbps each), not by buying a bigger box.

🔗
"Clone it to scale fast"
tap to flip

Never. The cloud fingerprints by static MAC; a clone/vMotion/NIC-swap changes it and breaks the identity. Build each connector fresh.

📥
"Open inbound 443"
tap to flip

No inbound, ever. The connector dials out only on TCP/UDP 443 — no public IP, no NAT, no DMZ. That is the whole model.

📍
"Centralise the connectors"
tap to flip

No. Selection is latency-based, so a connector goes near the app, not near the user — one per site/VPC that hosts apps.

Figure 1 — The App Connector dials OUT only: zero inbound, near the app
An App Connector opens only outbound TLS on TCP and UDP 443 plus NTP and DNS, with zero inbound firewall ports, and is deployed in the data centre right next to the apps it serves. A diagram of a corporate data centre as a dashed box. Inside sits an App Connector VM with its minimum spec and a static MAC, next to an app server. Green outbound arrows leave the box to the ZPA cloud Service Edge on TCP and UDP 443, to NTP on UDP 123, and to DNS. A red barrier on the perimeter firewall shows zero inbound ports are open. A note explains the connector is placed near the app for latency-based selection. Outbound-only. Zero inbound. Sat right next to the app. outbound allowed inbound blocked key insight Your data centre / VPC (apps live here) App Connector 2 vCPU · 4 GB · 8 GB App server 10.20.4.30 Static MAC pinned · do NOT clone or vMotion-randomise Connector sits NEAR the app, never near the user ZPA cloud Service Edge (broker) TCP/UDP 443 → *.prod.zpath.net UDP 123 NTP · DNS ✖ Zero inbound firewall rules — the app is never published Every arrow points OUT. Nothing points in. That is why a connector needs no DMZ, no public IP, and no inbound NAT — only egress to the Zscaler cloud.
The connector lives beside the app and only ever dials out (green). The red bar is the perimeter — note no arrow crosses it inward.

Anjali at Infosys faces this

Anjali stands up a connector, enrols it fine, then clones that VM to spin up a second one quickly. Within minutes BOTH connectors flap between Connected and Disconnected, and SAP access gets flaky.

Likely cause

The clone carries the SAME enrolment identity but a different (or duplicate) MAC. The cloud sees two machines claiming one identity and a MAC that no longer matches — so it keeps invalidating the session.

Fix

Never clone a live connector. Build the second VM fresh from the base image, pin its own static MAC, and enrol it with a key that allows a second use. Decommission the bad clone in the portal.

Verify (L2/L3)

Each connector shows a unique ID under its group; sudo systemctl status zpa-connector is steady-Connected on both, no flap in journalctl.

Pause & Predict

If a connector only ever dials outbound, what is the one outbound port your DC firewall MUST allow for the tunnel to even form? Type your guess.

Answer: Outbound TCP 443 (with UDP 443 for DTLS) to the ZPA cloud (*.prod.zpath.net / *.zscaler.net). Plus UDP 123 for NTP — without correct time the mTLS handshake later fails. There is no inbound rule at all.
👉 So far: tiny VM, supported Linux, static MAC, near the app, outbound-only. This is just the components/object-chain side that the ZPA Fundamentals lesson covers — here we actually deploy. Next: the egress rules the firewall team will ask you for.

② Egress rules: what the firewall team needs to open (and what they must NOT)

This is the section that turns a two-week ticket into a ten-minute one. When the firewall team asks "what do we open for this Zscaler thing?", the honest, complete answer is short — and the most important part is what you tell them not to do.

Do NOT SSL-inspect the connector's egress

The App Connector certificate-pins to the Service Edge. If an upstream firewall or proxy (Palo Alto, or ZIA itself) does break-and-inspect on its outbound 443, the pinned handshake is terminated and the Z-Tunnel never forms — yet the portal can still show stale "green". Add an SSL-inspection bypass for the ZPA cloud domains. This is a deliberate security control, not a misconfiguration to "fix".

Figure 2 — Egress allow-list: four lanes out, one wall in
The App Connector needs exactly three outbound lanes — TLS and DTLS on 443 to the Zscaler cloud, NTP on UDP 123, and DNS — while SSL inspection on that egress must be bypassed and all inbound stays blocked. A diagram showing an App Connector on the left with three green outbound lanes to the right: TCP and UDP 443 to the ZPA cloud, UDP 123 to an NTP source, and DNS to a resolver. An amber inspection box on the 443 lane is marked bypass-required because the connector certificate-pins. A red barrier at the bottom marks zero inbound. Three lanes out · bypass inspection on 443 · nothing in allow outbound inspection (bypass) blocked inbound App Connector dials out only SSL insp BYPASS TCP/UDP 443 ZPA cloud *.prod.zpath.net UDP 123 — NTP (mTLS needs correct time) NTP source DNS 53 — resolve cloud + internal FQDNs DNS resolver ✖ INBOUND: nothing — no NAT, no public IP, no DMZ. Break-and-inspect on 443 = dead tunnel (pinned cert).
Hand the firewall team this picture: three green lanes out, an amber "bypass inspection" flag on 443, and a hard red "no inbound" wall.
Quick check · Q1 of 10 · Remember

Your firewall team asks which traffic to allow for a new App Connector. What is the minimal correct answer?

Correct: b. The connector dials out only — TCP/UDP 443 to the cloud, UDP 123 NTP, DNS — and accepts nothing inbound. (a)/(c) re-expose the app and describe a VPN gateway; (d) SSL-inspecting the pinned egress kills the tunnel.

Rohit at TCS faces this

Rohit's new Mumbai-DC connector shows Disconnected even though the VM clearly has outbound internet and can browse. There is no obvious error in the portal.

Likely cause

The datacenter firewall is SSL-inspecting all outbound 443. The connector certificate-pins to the Service Edge, so the break-and-inspect terminates the pinned handshake — the Z-Tunnel never establishes.

Diagnosis

Run the built-in connector test; it shows the tunnel failing to reach the broker even though plain HTTPS browsing works.

sudo zpa-connector troubleshoot connection
Fix

Add an SSL-inspection bypass for *.zpath.net, *.zscaler.net, *.zscloud.net; confirm outbound UDP 123 (NTP) is allowed too. Re-test.

👉 So far: three outbound lanes, bypass inspection on 443, zero inbound. The VM is reachable to the cloud — now we give it its identity with a provisioning key.

③ The provisioning key — a secret you can corrupt with a curly quote

A provisioning key is what turns a blank Linux VM into your enrolled connector. It is an OAuth enrolment token, and three facts about it decide whether enrolment works:

You generate it in the portal, then drop it onto the VM at /opt/zscaler/var/provision_key. Two operational gotchas trip almost everyone the first time:

Stop the service BEFORE you drop the key — and beware curly quotes

Write the key while the connector service is running and it may read a half-written file and reject it. Stop zpa-connector first, write the key, then start. And never paste the key through a "smart-quote" editor or chat app: a single straight quote " silently rewritten to a curly corrupts the token, and the connector rejects it with a confusing error. Paste into a plain editor, or echo it from a shell that does not autocorrect.

Figure 3 — Provisioning-key handling: one group, capped uses, treat as secret
A provisioning key is bound to one App Connector Group with a Max Usage cap, is written to the connector only after stopping the service, and is corrupted by curly-quote paste — so it must be handled like a service-account secret. A flow showing a provisioning key generated in the portal, bound to a single App Connector Group with a usage cap. The key is carried to the VM, the zpa-connector service is stopped, the key is written to a file, then the service starts. A warning marks that curly-quote paste corruption silently rejects the key. A legend marks the key as a secret credential. Generate → carry → STOP service → write key → start handle as secret key insight ① Portal Add Provisioning Key bind 1 group · Max Usage ② Carry as secret no clear text · no wiki curly-quote = corrupt ③ Stop service systemctl stop zpa-connector then write the file ④ Start reads /opt/zscaler/ var/provision_key → enrols Key is bound to ONE App Connector Group · Max Usage = how many connectors it may enrol The key is a credential, not a config string. Leak it and a stranger can stand a connector up inside your trust boundary. A single curly quote silently rejects it.
Read it left to right: generate, carry as a secret, stop the service, write the file, start. The lime line is the one idea — the key is a password, not a setting.

Here is the real Add Provisioning Key form — recreated so you recognise the actual screen and the fields that matter.

https://admin.private.zscaler.com  ·  Administration ▸ Connector Provisioning Keys
Applications ▸
Policy ▸
Administration ▸
App Connectors
Connector Provisioning Keys
AUTHENTICATION
Administration ▸ Connector Provisioning Keys ▸ Add Provisioning Key
Generate an enrolment token. Treat the value like a password — it is shown once.
Namemumbai-dc-key-2026
1App Connector GroupMumbai-DC-Group ▾  bound to ONE group
2Max Usage2  — one per connector in this group
Signing CAConnector ▾
3Key value (generated)3:eyJ0eXAi…<copy now>
1 the group this key can enrol into   2 how many connectors it may onboard   3 copy the value once — paste into a plain editor, never a smart-quote app
🖥️ Recreated for clarity — your ZPA console matches this. Path: Administration ▸ Connector Provisioning Keys ▸ Add Provisioning Key. Pins ①②③ are the fields that decide which group enrols, how many connectors, and the secret you must not corrupt.
On the App Connector VM — drop the key the safe way
sudo systemctl stop zpa-connector
# paste the key into a PLAIN editor first (no smart quotes), then:
sudo install -o zscaler -g zscaler -m 600 provision_key.txt /opt/zscaler/var/provision_key
sudo systemctl start zpa-connector
sudo systemctl status zpa-connector --no-pager
Expected output
● zpa-connector.service - Zscaler App Connector
     Active: active (running) since Wed 2026-06-03 09:14:02 IST
     Status: "Connected to broker bom2-vse-01, tunnel UP"
Quick check · Q2 of 10 · Apply

You are dropping the provisioning key onto a fresh connector VM. Which sequence is correct?

Correct: c. Stop the service first so it does not read a half-written file, drop the key with no smart-quote corruption, then start. (a) risks a partial read; (b) mail clients curl-quote and corrupt the token; (d) leaks a credential.
👉 So far: the key is bound to one group, capped, secret, dropped with the service stopped. Start the service and the real magic begins — the mTLS enrolment handshake. Which is exactly where clock skew bites.

④ Enrolment & the mTLS handshake — why NTP skew = "Disconnected forever"

When you start the service with a valid key, the connector enrols: it presents the key, the ZPA cloud validates it, and the two sides complete a mutual TLS handshake. The cloud issues the connector a short-lived, timestamp-validated certificate, and from then on the connector holds an outbound Z-Tunnel to the broker.

That word timestamp-validated is the whole section. The certificate carries "not-before" and "not-after" times. If the connector's clock is wrong — even by a few minutes — it can present or validate a cert whose window has not opened yet, and the handshake fails with certificate is not yet valid. The connector then shows Disconnected and, because it never gets time-synced on its own, it stays that way forever. This is why UDP 123 (NTP) is not optional.

Figure 4 — Enrolment decision flow: time-sync is the gate the whole handshake hangs on
Connector enrolment only reaches Connected when the clock is in sync — an out-of-sync clock makes the timestamp-validated mTLS certificate appear not-yet-valid and the connector stays Disconnected forever. A decision tree. The connector starts with a valid key and presents it to the cloud. A decision asks whether the clock is in sync via NTP. If yes, the mTLS handshake succeeds, the short-lived certificate is accepted, and the connector reaches Connected. If no, the certificate appears not-yet-valid, the handshake fails with certificate is not yet valid, and the connector stays Disconnected forever until NTP is fixed. Valid key is not enough — the clock decides Connected vs Disconnected decision Connected Disconnected Start service presents valid key Clock in sync (NTP)? Yes mTLS handshake OK short-lived cert accepted → CONNECTED No cert "not yet valid" window has not opened — handshake fails → DISCONNECTED forever (until NTP fixed) A connector with a wrong clock will NEVER self-heal — it cannot enrol to learn the time. Allow outbound UDP 123 and confirm "System clock synchronized: yes" BEFORE you blame the key.
The amber diamond is the only gate that matters here: clock in sync → Connected; clock skewed → "not yet valid" → Disconnected with no self-recovery.

▶ Watch a connector enrol — then break it with NTP skew

Press Play for a healthy enrolment to Connected, then Break it to see how a wrong clock leaves it Disconnected forever.

① DEPLOYVM is built (2 vCPU/4 GB/8 GB, static MAC) and the provisioning key is written to /opt/zscaler/var/provision_key
② DIAL OUTsystemctl start zpa-connector — the connector dials out on 443 to *.prod.zpath.net and presents the key
③ mTLSBoth sides exchange certs; the cloud issues a short-lived, timestamp-validated cert — clock must be correct
④ CONNECTEDThe Z-Tunnel is UP; the connector appears Connected under its group and can proxy sessions
Press Play to step through a healthy enrolment. Then press Break it.
Quick check · Q3 of 10 · Apply

A freshly deployed connector stays Disconnected. journalctl shows certificate is not yet valid. What do you fix first?

Correct: a. "Not yet valid" is the signature of clock skew against a timestamp-validated cert — fix NTP and it enrols. (b) RAM is irrelevant; (c) connectors never need inbound; (d) the key error reads differently and a wrong clock will reject any key.

Sneha at Flipkart faces this

Sneha's connector enrolled perfectly in the lab but goes Disconnected in production, with certificate is not yet valid in the logs. Nothing about the key changed.

Likely cause

The production segment blocks outbound UDP 123, so the VM's clock drifted minutes off. The cloud's short-lived cert then looks "not yet valid" to the skewed connector and the handshake never completes.

Diagnosis

Check the clock state on the VM directly.

timedatectl status | grep -i synchronized
Fix

Allow outbound UDP 123 to an NTP source, force a sync, then restart the connector. It enrols within seconds once time is correct.

Verify

System clock synchronized: yes, and systemctl status zpa-connector reads Connected with a steady tunnel.

Pause & Predict

Why can a clock-skewed connector never recover on its own, even though NTP would fix it? Type your guess.

Answer: Because the connector does not learn time from the broker — it must already have correct time to complete the mTLS handshake that connects it. No handshake, no session, and (if UDP 123 is blocked) no NTP either. It is a chicken-and-egg loop you break by fixing NTP at the OS, not in ZPA.
👉 So far: enrolment is an mTLS handshake gated by the clock; NTP is mandatory. One connector now works — but one connector is a single point of failure. Time to make it survive its own auto-update.

⑤ High availability — why one connector is an outage waiting for its own upgrade

Connectors auto-update on a schedule you set per group. That is good — patched agents, no manual work. But an update restarts the connector, and during that restart it cannot proxy traffic. With a single connector, your "maintenance window" is every time Zscaler ships an update, whether you planned it or not.

The fix is built into the product: deploy at least two connectors per App Connector Group. ZPA staggers their auto-updates in a round-robin — it upgrades one while the other keeps serving, then swaps. Two connectors means the group is always up; one connector means the group goes dark every upgrade.

Figure 5 — Rolling auto-update: a pair stays up, a single connector goes dark
A two-connector group stays available through a staggered round-robin auto-update because one keeps serving while the other upgrades, whereas a single connector creates an outage window every time it auto-updates. Two timelines side by side. The top timeline shows a group of two connectors during an auto-update: connector A upgrades while connector B serves, then B upgrades while A serves, so the app stays reachable the whole time. The bottom timeline shows a single connector that goes offline during its own upgrade, producing an outage window where the app is unreachable. Same upgrade. Two connectors = no outage. One = an outage window. serving upgrading app unreachable 2-connector group (HA) t0 t1 (A upgrades) t2 (B upgrades) t3 A serving upgrading serving serving B serving serving upgrading serving App reachable the WHOLE time — round-robin staggers the two upgrades 1-connector group (no HA) A serving upgrading — OFFLINE serving ⟵ outage window every auto-update Deploy ≥2 per group. Always.
Top: a pair, where round-robin keeps one connector serving at all times. Bottom: a lone connector goes red — offline — every single auto-update.

Here is the real App Connectors health view — the screen where you confirm a group has its HA pair Connected before you trust it in production.

https://admin.private.zscaler.com  ·  Administration ▸ App Connectors
Applications ▸
Policy ▸
Administration ▸
App Connectors
App Connector Groups
Connector Provisioning Keys
App Connectors — Group: Mumbai-DC-Group
A healthy group shows ≥2 Connected so an auto-update cannot cause an outage.
Connector1Status2VersionPrivate IP
mumbai-conn-a● Connected24.x.x (current)10.20.4.11
mumbai-conn-b● Connected24.x.x (current)10.20.4.12
3chennai-conn-x● Disconnected — cert not yet valid (NTP)10.30.2.9
1 two Connected = the group survives a round-robin update   2 versions stagger during auto-update, never both at once   3 a Disconnected connector with "cert not yet valid" is a clock-skew/NTP fix, not a key fix
🖥️ Recreated for clarity — your ZPA console matches this. Path: Administration ▸ App Connectors. Pins ①②③ are the columns that tell you whether the group is genuinely HA and why a connector is down.

Priya at Wipro faces this

Priya inherited a ZPA tenant and sees a group with one Connected and one Disconnected connector. The portal shows the dead one stuck on an older version.

Likely cause

The Disconnected connector never finished a past auto-update — most often because its clock drifted (NTP blocked) so it could not re-handshake mTLS, leaving the "group" effectively single-connector and exposed during the next upgrade.

Diagnosis

On the dead VM, confirm time first.

timedatectl status | grep -i synchronized
Fix

Allow outbound UDP 123, sync the clock, restart the connector; it re-enrols and rejoins the round-robin. Now the group is genuinely HA again.

Vikram at HDFC Bank faces this

Vikram ran a single connector for a critical payments app "to save cost". Every few weeks users report a 3–4 minute outage at odd hours that nobody scheduled.

Likely cause

The connector's scheduled auto-update restarts it; with only one connector in the group, the app is unreachable for the length of the upgrade. The "odd hours" are the group's upgrade window.

Fix

Deploy a second connector into the same group (fresh VM, own static MAC, key with Max Usage ≥2). ZPA round-robins the updates so one always serves.

Verify (L2/L3)

The group shows two Connected connectors; trigger/await the next update and confirm the app stays reachable while one shows "upgrading".

L3 architect note — group placement and the update schedule

HA is per group, and selection is latency-based within a group, so put both connectors of a group close to the same apps — splitting an HA pair across two distant sites defeats latency selection and can leave one site unserved during the other's upgrade. Also set the group's upgrade schedule to your real low-traffic window; the round-robin still applies, but a sane window keeps even brief per-connector blips off peak.

👉 So far: ≥2 per group, round-robin auto-update, placed near the same apps. The connector is deployed, enrolled and HA. Last stop — the operational reality of keeping it healthy, patched, and out of the way of SSL inspection.

⑥ Operate it: CLI, SSL-bypass discipline, and patching (the real CVE)

A deployed connector is a Linux service you operate like any other — three commands cover almost every day-2 task. Memorise these; they answer "is it up, why not, and what does it see?"

Day-2 App Connector CLI — the three you will actually use
sudo systemctl status zpa-connector          # is the service up?
sudo journalctl -u zpa-connector -n 50       # why did it fail / flap?
sudo zpa-connector troubleshoot connection   # can it reach the broker + the app?
Expected output
[broker]   tunnel: UP   (edge: bom2-vse-01)   latency: 12ms
[time]     System clock synchronized: yes
[app]      10.20.4.30:443  reachable

If the tunnel is UP but the app line is unreachable, the problem is connector-to-app routing — not ZPA. If time is not synchronized, fix NTP before anything else.

SSL-inspection bypass is permanent, not a one-time fix

Because the connector cert-pins to the Service Edge, your SSL-inspection bypass for the ZPA cloud domains must stay in place. A common regression: someone "cleans up" firewall bypass rules months later, the next connector update re-handshakes through a now-inspecting proxy, and the whole group goes Disconnected. Document the bypass for *.zpath.net / *.zscaler.net / *.zscloud.net as load-bearing — never "temporary".

Patch the agent — the client is the enforcement point

Real CVE — CVE-2025-54983 (Zscaler Client Connector for Windows)

Disclosed 11 Nov 2025 (CVSS 5.2, Medium): a health-check port in ZCC for Windows was not properly released after use, so traffic could bypass ZCC forwarding controls — escaping ZPA enforcement entirely. This is the user-agent side of the same zero-trust system your App Connectors serve: if the client can sidestep enforcement, a healthy connector does not save you. Fix: upgrade ZCC to 4.6.0.216+ (4.6.x) or 4.7.0.47+ (4.7.x), or later, and keep agents on a managed auto-update channel. (The App Connector itself auto-updates per group — patch hygiene matters at both ends of the tunnel.)

▶ Day-2 health check — and what an SSL-inspection regression looks like

Press Play to walk a healthy day-2 check, then Break it to see a re-enabled SSL-inspection rule knock the group offline at the next update.

① STATUSsystemctl status zpa-connector → Active (running), tunnel UP to the broker
② TIMEtimedatectl confirms clock synchronized: yes — mTLS stays valid
③ REACHtroubleshoot connection shows the app reachable from the connector
④ HEALTHYGroup has ≥2 Connected connectors; auto-update will round-robin without an outage
Press Play to step through a healthy day-2 check. Then press Break it.

Arjun at TCS faces this

Arjun's connector group was stable for months, then both connectors went Disconnected on the same night — right after a scheduled auto-update. Nobody touched ZPA.

Likely cause

A firewall change re-enabled SSL inspection on outbound 443 (the bypass got "cleaned up"). The next auto-update forced a fresh pinned handshake — which the inspecting proxy broke for both connectors at once.

Diagnosis

Run the connector test; the tunnel fails to reach the broker even though the box has internet.

sudo zpa-connector troubleshoot connection
Fix

Re-add the permanent SSL-inspection bypass for the ZPA cloud domains and mark it load-bearing in change control. The group reconnects on the next handshake.

Pause & Predict

You SSH into an internal app server through ZPA, and the connection works through one connector but breaks during the group's upgrade window even though you deployed two connectors. What is the most likely placement mistake? Type your guess.

Answer: The two connectors are probably in different groups (or different sites), so they are not an HA pair — round-robin only staggers updates within one group. Put both connectors in the same App Connector Group, near the same apps, and the group stays up through the upgrade.
Quick check · Q4 of 10 · Apply

Which set of CLI commands best covers "is it up, why not, and can it reach the app?" for a connector?

Correct: d. Status answers "up?", journalctl answers "why not?", and troubleshoot connection answers "can it reach the broker and the app?". (a)/(b) are generic and ignore the connector service; (c) is false — the CLI is exactly where you diagnose it.
Prove it worked — from the connector and the group, not a single green dot

A connector is "done" when three things are true, not one: systemctl status zpa-connector reads Connected with a steady tunnel, timedatectl shows the clock synchronized, and the App Connector Group shows ≥2 Connected connectors so an auto-update cannot cause an outage. Green on one connector is tunnel health; two-Connected-in-a-group is availability truth.

👉 You can now size, place, key, enrol and HA-pair an App Connector, fix the NTP-skew and SSL-inspection traps, and patch the CVE. Lock it in below, then go hands-on in the App Connector lab.

🤖 Ask the AI Tutor

Tap any question — instant, scoped to this lesson. No login, no waiting.

Pre-curated from Zscaler docs + community Q&A, scoped to this lesson. For a live prod issue, paste your export into chat.techclick.in.

📝 Wrap-up assessment — six more

You've answered 4 inline. Six left. 70% (7 of 10) marks the lesson complete on your profile. Tap Submit all answers at the end.

Q5 · Analyze

A connector was cloned from a working VM to spin up a second one fast. Now both flap between Connected and Disconnected and app access is unstable. What is the root cause?

Correct: b. The cloud fingerprints a connector partly by MAC; a clone duplicates identity and changes/duplicates the MAC, so both flap. Never clone a live connector — build fresh, pin a unique static MAC. (a)/(c) are irrelevant (connectors need no inbound); (d) a multi-use key is fine up to Max Usage.
Q6 · Analyze

A new connector shows Disconnected; journalctl logs certificate is not yet valid and the VM has full outbound internet. What is happening?

Correct: c. "Not yet valid" is the clock-skew signature against a timestamp-validated cert; with UDP 123 blocked the VM never time-syncs and never enrols. (a) disk would log differently; (b) would not produce a cert-time error; (d) a wrong-group key fails enrolment with a different error.
Q7 · Analyze

A connector group was stable for months, then both connectors went Disconnected on the same night, right after a scheduled auto-update. Nobody touched ZPA. Most likely cause?

Correct: a. A re-enabled SSL-inspection rule breaks the connector's pinned handshake; the next update re-handshakes and both fail together. (b) is false — round-robin staggers updates; (c) app reboots do not disconnect the tunnel; (d) Max Usage limits new enrolments, it does not revoke running connectors.
Q8 · Analyze

After dropping a freshly generated key onto the VM, the connector rejects it with a confusing parse-style error, even though the key is valid in the portal. What did the engineer most likely do wrong?

Correct: d. Curly-quote paste corruption silently invalidates the key value even when the portal copy is correct. (a) RAM is unrelated to key parsing; (b) inbound is never needed; (c) placement affects latency, not key validity.
Q9 · Evaluate

A team proposes running ONE App Connector per group "to save cost" for a business-critical app. Evaluate this design for availability.

Correct: b. Auto-update restarts the connector; with one in the group the app goes dark for the upgrade. Two-plus lets ZPA round-robin so one always serves. (a)/(c) are false (it does restart, and there is no buffering); (d) names a throughput limit, not the availability flaw.
Q10 · Evaluate

An engineer deployed two connectors for HA but splits them across two distant sites (one group each) and complains HA "isn't working" during upgrades. Evaluate and recommend.

Correct: c. Round-robin and HA are per-group, and selection is latency-based within a group — two single-connector groups give each app no in-group partner during its upgrade. Co-locate the pair in one group near the app. (a) ignores the per-group rule; (b) inbound is never used; (d) NTP matters but is not the HA design flaw here.
Lesson complete — saved to your profile.
Almost! You need 70% (7 of 10) — re-read the path that tripped you up and tap "Try again".

🧠 In your own words

Type one line: why does an App Connector show Disconnected forever if its clock is wrong? Then compare to the expert version.

Expert version: Because enrolment is an mTLS handshake and the cloud issues a short-lived, timestamp-validated certificate. A skewed clock makes that cert look not-yet-valid, so the handshake fails — and the connector cannot self-heal because it needs correct time to complete the very handshake that would connect it. Fix NTP (outbound UDP 123) at the OS, not in ZPA.

🗣 Teach a friend

Best way to lock it in — explain it in one line to a teammate. Tap to generate a paste-ready summary.

📖 Glossary

App Connector
A lightweight Linux VM (2 vCPU / 4 GB / 8 GB) you run next to your apps; it dials outbound-only to the ZPA cloud and proxies authorised sessions to the real server. Zero inbound ports.
App Connector Group
The unit of HA, scaling and auto-update. Deploy ≥2 connectors per group; ZPA round-robins their upgrades so one always serves.
Provisioning Key
An OAuth enrolment token bound to exactly one App Connector Group, with a Max Usage cap. It is a secret — treat it like a service-account password.
Max Usage
The number of connectors a provisioning key may enrol before it stops working. Set it to the connector count for that group.
Static MAC
A pinned MAC address on the connector VM. The ZPA cloud fingerprints the connector partly by MAC, so cloning, vMotion NIC-randomise, or a NIC swap breaks the enrolled identity.
Enrolment
The first-contact process where a connector presents its provisioning key, the cloud validates it, and the two complete a mutual-TLS handshake to establish the Z-Tunnel.
mTLS handshake
Mutual TLS — connector and Service Edge each prove identity with certificates. The connector receives a short-lived, timestamp-validated certificate.
NTP / clock skew
Network Time Protocol (UDP 123). A wrong clock makes the timestamp-validated cert appear "not yet valid", so the connector stays Disconnected until time is fixed — it cannot self-heal.
Z-Tunnel
The persistent, certificate-pinned outbound TLS/DTLS tunnel the connector holds to the Service Edge on TCP/UDP 443.
Rolling auto-update
Per-group scheduled upgrade that staggers connector restarts round-robin, so a multi-connector group has no outage while a single connector goes dark during its own upgrade.
Certificate pinning
The connector strictly validates the Service Edge cert. Any inline SSL/TLS inspection on its egress breaks the Z-Tunnel by design — bypass the ZPA cloud domains.
Latency-based selection
ZPA routes a user to whichever connector in the group can reach the app fastest — which is why connectors go near the app, not near the user.

📚 Sources

  1. Zscaler Help — About Connector Provisioning Keys (a key functions like a credential, is bound to one App Connector Group, and has a Max Usage count). help.zscaler.com/zpa
  2. Zscaler Help — Deploying App Connectors + platform install guides (minimum 2 vCPU / 4 GB / 8 GB, supported RHEL/CentOS/Oracle Linux, static MAC requirement, /opt/zscaler/var/provision_key). help.zscaler.com/zpa
  3. Zscaler Help — Configuring App Connector Groups + App Connector upgrade/HA best practices (deploy ≥2 per group, staggered round-robin auto-update, latency-based selection). help.zscaler.com/zpa
  4. Zscaler Community — connector enrolment and certificate is not yet valid / NTP clock-skew threads (UDP 123 mandatory; connector cannot self-heal a wrong clock). community.zscaler.com
  5. Zscaler Community — connectors showing Disconnected behind SSL-inspecting firewalls (cert-pinning breaks break-and-inspect; bypass *.zpath.net / *.zscaler.net). community.zscaler.com
  6. NVD — CVE-2025-54983, Zscaler Client Connector for Windows (health-check port not released → forwarding/ZPA-enforcement bypass; fixed 4.6.0.216+ / 4.7.0.47+). nvd.nist.gov
  7. Zscaler Cyber Academy — EDU-202 (ZDTE) Connectivity Services blueprint (App Connector deployment, provisioning, group HA, upgrade scheduling — the exam-critical objectives this lesson teaches). zscaler.com

What's next?

You can now deploy, enrol and HA-pair an App Connector. Next, see why ZPA beats a VPN architecturally — the attack-surface, lateral-movement and same-LAN trade-offs an L2 engineer designs around — and where a Private Service Edge fits.