Most engineers think…
Most engineers think Browser Access is just “ZPA without the agent” — flip one checkbox and the same app shows up in a browser.
Wrong. BA is a clientless reverse proxy: the browser does a real TLS handshake against a certificate you supply, reached through a public DNS name you publish. Get the certificate or the DNS wrong and the app is dead before any access policy ever runs. That is why the No.1 BA support ticket was never the policy — it was the certificate.
Picture a video-KYC with your bank. You finish the whole thing inside your phone's browser — the bank installs nothing on your device, never lets you walk into the branch back-office, and you only ever see your account screen. That is exactly what Browser Access does for an internal web app: a contractor on an unmanaged laptop reaches one private app from a plain browser, sees only that app, and never touches your network.
It sounds like “ZPA minus the agent”. It isn't. Browser Access is a reverse proxy: the browser does a real TLS handshake against a certificate you supply, reached through a public DNS name you publish. Get the certificate or the DNS wrong and the app is dead before any access policy is ever evaluated. That is why, for years, the No.1 Browser Access support ticket was never the policy — it was the certificate.
① How a browser with no agent reaches a private app
Start with the journey, because every later decision hangs off it. The user's browser talks to the Zscaler cloud, never to your network. Think of the App Connector as a concierge: you hand your request at the front desk, the concierge fetches the file from a back room you are never allowed to enter, and brings it to you at reception.
▶ The clientless request, stage by stage
A contractor opens apps.acme-ext.com in Chrome. Press Play for the healthy path, then Break it to see the most common failure.
In a Browser Access session, which component opens the actual connection to the private web app?
Pause & Predict
If Browser Access is clientless — no agent on the device — where does full device posture get checked? Type your guess.
🏛 Architect note. Between the broker and the App Connector the session rides a Microtunnel inside a TLS tunnel to the Zero Trust Exchange. An optional double_encrypt flag adds a second encryption layer across the ZPA fabric — but it is mutually exclusive with Browser Access on the same segment (more on that in §4).
The words you need first
Four ideas carry the whole lesson. Tap each card.
ZPA serves one internal web app to any browser, no ZCC agent. So what: contractors and BYOD reach the app without installing anything.
ZPA terminates the user's HTTPS and re-originates a fresh request to the app. So what: the user touches the published app, never your network.
The TLS cert ZPA presents for the BA URL — you supply it, or let Zscaler manage it. So what: if the browser doesn't trust it, the app is blocked before login.
The public FQDN users type; it CNAMEs to the Zscaler cloud. So what: no public CNAME = the URL doesn't resolve = nobody gets in.
② The application domain and the public CNAME
Here is the part people skip and then spend an afternoon debugging. The browser resolves the Browser Access URL over the public internet — it has no tunnel and no agent to hand it an internal answer. So every BA app needs a publicly-resolvable name, and you must point that name at Zscaler yourself.
When you save a BA app, ZPA generates a
Canonical Name (CNAME).
You copy it and create a public DNS CNAME record: your external FQDN
(e.g. apps.acme-ext.com) → that Zscaler host. That record is what makes
the URL resolve for the user on the open internet.
dig +short apps.acme-ext.com CNAME dig +short apps.acme-ext.com
bba-12ab34.private.zscaler.com. bba-12ab34.private.zscaler.com. 165.225.xx.xx
If the first line is empty, the CNAME was never published — that is an NXDOMAIN for every
external user, no matter how perfect the policy is. On the App Connector side it is the
opposite mistake: the Connector must use internal DNS that resolves
wiki.corp.local to its real private IP. Point it at public DNS and the internal
name resolves back to the Zscaler address — a loop.
Sneha at Infosys faces this
A new Browser Access app works for nobody outside the office. Browsers just say “site can't be reached”.
The public DNS CNAME record was never created — the external FQDN doesn't point at Zscaler, so it doesn't resolve on the internet.
dig +short apps.acme-ext.com CNAME returns nothing. Re-open the Browser Access table and copy the Canonical Name.
Add a public DNS CNAME: apps.acme-ext.com → bba-xxxx.private.zscaler.com. Or switch to Zscaler-Managed Certificates, which auto-publish the CNAME.
dig +short now returns the Zscaler host, and the URL loads. Allow a few minutes for DNS propagation.
A new BA app fails for all external users; dig apps.acme-ext.com returns NXDOMAIN. The single most likely cause?
Pause & Predict
Your App Connector needs to find wiki.corp.local. Which DNS should it use — public or internal? Type your guess.
③ The certificate — the No.1 Browser Access support ticket
At TLS leg 1 the browser validates a certificate, and there is no Zscaler client on the device to quietly trust anything. So the cert ZPA presents must chain to a CA the browser already trusts. Three knobs decide whether it works.
1. Public CA vs internal CA
You can upload a cert signed by a public CA, or a self-signed / internal-CA cert. For unmanaged and BYOD users the internal root simply isn't on their device, so the real-world rule is: use a publicly-trusted certificate unless every device that will ever use the app has your private root pre-installed.
2. The full chain, not just the leaf
Upload the leaf + all intermediates. The classic “works for some
users, not others” bug is a missing intermediate: managed laptops got the root via
GPO and paper over it; BYOD machines don't, so they fail. The error is the same on both —
NET::ERR_CERT_AUTHORITY_INVALID.
3. Wildcard vs SAN
A wildcard
*.acme.com covers apps.acme.com but not
apps.eu.acme.com — wildcards match one level only. For multi-level or specific
hostnames, use a SAN certificate.
🖥️ This is the screen you'll use — ZPA Admin Portal → Application Segments → [your segment] → Browser Access → Add Application. (Recreated for clarity — your console matches this.)
① the public FQDN users type · ② the cert ZPA presents (pick Zscaler-Managed for auto-renew + auto-DNS, or an uploaded cert) · ③ the read-only CNAME you must paste into public DNS.
Two more cert gotchas worth memorising. First, generate the CSR inside the ZPA portal (Administration → Certificates). ZPA only holds the private key for CSRs it generated; bring an externally-minted cert and the upload fails with “A matching CSR was not found or a private key was not present.”
Second — and this is the big 2025 change — turn on Zscaler-Managed Certificates. Announced June 2025, it auto-generates and auto-renews the BA cert and auto-publishes the public CNAME. That single switch removes most of the war stories in this section — expired certs, missing intermediates, and forgotten DNS records all disappear.
echo | openssl s_client -connect apps.acme-ext.com:443 -servername apps.acme-ext.com -showcerts 2>/dev/null \ | openssl x509 -noout -subject -issuer
subject=CN = apps.acme-ext.com issuer=C = US, O = DigiCert Inc, CN = DigiCert Global G2 TLS RSA SHA256 2020 CA1
Rahul at TCS faces this
The BA app opens fine on office laptops, but contractors on personal laptops get NET::ERR_CERT_AUTHORITY_INVALID.
The cert was signed by the company's internal CA (or shipped leaf-only). Office laptops have that root via GPO; contractor BYOD machines don't, so the chain can't be validated.
The “some users only” pattern is the tell. Run the openssl s_client check above and inspect the issuer chain.
Re-issue with a public-CA cert including the full intermediate chain — or switch the app to Zscaler-Managed Certificates so the trust problem disappears.
A contractor on BYOD loads the app with a clean padlock — no warning, no “Proceed anyway”.
A BA app loads on corporate laptops but contractors on BYOD get NET::ERR_CERT_AUTHORITY_INVALID. Best fix?
Pause & Predict
You upload only the leaf certificate — no intermediate. Predict which users break first, and which don't. Type your guess.
④ Build the app — then survive the five failures
The build is short once the cert and DNS are sorted. Five steps:
- Certificate — pick Zscaler-Managed, or generate a CSR in
Administration → Certificates, get it signed, upload the full chain. - Enable Browser Access on the application segment; set the Domain, Application Protocol (HTTP/HTTPS only), Port, and the Certificate.
- Publish DNS — copy the Canonical Name and add the public CNAME (skipped automatically with Managed certs).
- Access policy + IdP — a default-deny access policy with a SAML IdP so the user can authenticate clientlessly.
- Internal DNS — point the App Connector at internal DNS that resolves the app's real IP.
Now the part that fills support queues. Here are the five failures, each as a symptom you'll actually see in the wild.
1. Cert untrusted / chain incomplete — symptom: NET::ERR_CERT_AUTHORITY_INVALID for some users. Fix: public-CA cert, full chain, or Managed certs.
2. Name mismatch — symptom: NET::ERR_CERT_COMMON_NAME_INVALID. Cause: the external FQDN isn't in the cert's SAN, or a wildcard was used for a multi-level host. Fix: SAN must list the exact FQDN.
3. DNS loop — symptom: BA flaky / Connector DNS errors. Cause: the App Connector resolves the internal name via public DNS. Fix: split-DNS to the real internal IP.
4. SAML redirect loop — symptom: user bounces back to the IdP sign-in, often only in Chrome with third-party cookies blocked. Fix: set SameSite=None on BA/auth cookies, allow the cookie, check clock sync.
5. App renders broken — symptom: page loads but images 404 and links point at intranet.corp.local. Cause: the app hardcodes internal absolute URLs; BA does not deep-rewrite page bodies. Fix: relative URLs, or publish each internal host as its own BA app.
🖥️ The failure you must recognise on sight — failure #1, the untrusted certificate chain. (Recreated for clarity — your browser shows this.)
Cause → effect: an internal-CA or leaf-only certificate (Figure 3, left panel) produces exactly this on any device that lacks the root. The fix lives in the certificate, never in the browser.
▶ What the browser checks at TLS leg 1
The certificate handshake, step by step. Press Play, then Break it to drop the intermediate.
🔧 Engineer note. Two more boundaries bite teams late. Double Encryption is mutually exclusive with Browser Access on the same segment — enable it for compliance and BA on that segment goes dead silently; keep them on separate segments. And BA serves web only (HTTP/HTTPS); clientless RDP/SSH/VNC is Privileged Remote Access (PRA), and anything non-web needs the full ZCC tunnel.
You need one certificate to cover hr.acme.com, wiki.acme.com and vpn.acme.com. Cheapest valid option?
acme.com, so one wildcard *.acme.com covers them — cheapest and valid. Three certs (b) work but cost more; a SAN (c) also works but isn't the only option here; disabling validation (d) is never acceptable. (If one host were hr.eu.acme.com, the wildcard would fail and you'd need a SAN.)One screen to remember it all
A green form doesn't mean a working app. Confirm three things from outside the portal: dig +short <fqdn> CNAME returns the Zscaler host, openssl s_client … -showcerts shows a complete chain to a public root, and the app loads with a clean padlock on a device that has none of your internal roots. For deeper triage, use the portal's Browser Access error codes and clientless access diagnostics.
🤖 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.
🧠 In your own words
Type one line: Why does a Browser Access URL need a public DNS CNAME AND a publicly-trusted certificate, when the app itself is private? Then compare to the expert version.
🗣 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
- Browser Access (BA)
- Clientless access to one internal web app through ZPA — the user needs only a browser, no Zscaler agent.
- Clientless
- No software installed on the device; access happens entirely in the browser.
- Reverse proxy
- ZPA terminates the user's HTTPS at the edge and re-originates a fresh request to the app — the user never touches the network.
- App Connector
- The lightweight VM/container beside the private app; it dials outbound to the Zero Trust Exchange and brokers the session.
- Application domain (FQDN)
- The public hostname users type; it must CNAME to the Zscaler cloud.
- Canonical Name (CNAME)
- The Zscaler-side host your public DNS record points at; shown with a Copy icon in the Browser Access table.
- Web-server certificate
- The TLS certificate ZPA presents for the BA URL — supplied by you or managed by Zscaler.
- Full chain
- Leaf + all intermediate certificates; a missing intermediate causes “works for some users” failures.
- Wildcard vs SAN
- Wildcard
*.acme.commatches one label level only; a SAN cert lists each exact hostname. - Zscaler-Managed Certificates
- 2025 feature — ZPA auto-generates, auto-renews and serves the BA cert and auto-publishes the CNAME.
- Double Encryption
- An extra encryption layer across the ZPA fabric — mutually exclusive with Browser Access on the same segment.
- PRA
- Privileged Remote Access — clientless RDP/SSH/VNC in the browser; the non-web sibling of Browser Access.
📚 Sources
- Zscaler Help — About Browser Access. help.zscaler.com/zpa/about-browser-access
- Zscaler Help — Browser Access (Canonical Name / CNAME, BA table). help.zscaler.com/zpa/browser-access
- Zscaler Help — About (Web Server) Certificates & Uploading Web Server Certificates. help.zscaler.com/zpa
- Zscaler Help — Using Wildcard Certificates for Browser Access Applications. help.zscaler.com/zpa/using-wildcard-certificates-browser-access-applications
- Zscaler Blog (Jun 2025) — ZPA Browser Access made easier: Zscaler-Managed Certificates & Unified Portal. zscaler.com/blogs
- Zscaler Help — Defining a Browser Access Application with Different External vs Internal Domains. help.zscaler.com/zpa
- Microsoft Learn — Configure ZPA SSO with Microsoft Entra ID (SAML SP-initiated flow). learn.microsoft.com
- Zscaler Community — BA app-segment config, cert-upload (“matching CSR not found”), DNS resolution threads. community.zscaler.com
- Zscaler Terraform provider — zpa_application_segment_browser_access (field schema). registry.terraform.io/providers/zscaler/zpa
What's next?
You can publish a clientless web app and prove it works. Next: clientless RDP, SSH and VNC — and the certificate, SNI and SAML mechanics that sit under both Browser Access and Privileged Remote Access.