Skip to content
Back to skills

Source 3aa1b190211737d1c322717c

ASecurity

End-to-end onboarding of a new Browser Access (BA) application in Zscaler Private Access. Walks through the full dependency chain — App connector group, server group, segment group, BA TLS certificate, BA application segment with apps_config, and access policy rule — for web apps that should be reachable through the browser without Zscaler Client Connector. Use only when the admin explicitly asks for Browser Access. DO NOT USE WHEN: the admin wants a regular client-routed application segment ...

  • 2 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added November 7, 2026
testinggitapi

Works with

  • cli
  • api

Security analysis

A100/100

Pro scans all 3 files and shows the line behind each finding

Scanned November 7, 2026

npx -y skills add gutsofpratik/OpenClaude-Skills --skill source-3aa1b190211737d1c322717c --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Source 3aa1b190211737d1c322717c?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Source 3aa1b190211737d1c322717c
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/gutsofpratik-source-3aa1b190211737d1c322717c/badge)](https://www.skillsdirectory.com/skills/gutsofpratik-source-3aa1b190211737d1c322717c)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: zpa-application_segment-ba-onboard
description: "End-to-end onboarding of a new Browser Access (BA) application in Zscaler Private Access. Walks through the full dependency chain — App connector group, server group, segment group, BA TLS certificate, BA application segment with apps_config, and access policy rule — for web apps that should be reachable through the browser without Zscaler Client Connector. Use only when the admin explicitly asks for Browser Access. DO NOT USE WHEN: the admin wants a regular client-routed application segment (use zpa-application_segment-onboard instead)."
---

# ZPA: Onboard Browser Access Application

## Keywords

browser access, ba application, clientless access, agentless zpa, web app publish, browser-only application, onboard browser access, no client connector, agentless access, ba app segment

## Overview

Onboard a new **Browser Access (BA)** application in Zscaler Private Access. BA segments publish web applications to authorized users through the browser, without requiring Zscaler Client Connector. This skill walks through the full dependency chain — connector group → server group → segment group → **BA TLS certificate** → **BA application segment with `apps_config`** → access policy rule.

**Use this skill when:** The admin explicitly mentions Browser Access, agentless access, clientless ZPA, or publishing a web app to users who do not have ZCC installed.

**DO NOT use this skill when:**

- The admin wants a regular client-routed application segment (any TCP/UDP app reachable via ZCC) — use `zpa-application_segment-onboard` instead.
- The admin asks about Privileged Remote Access (PRA) for SSH/RDP — that is a separate flow.

---

## What makes BA different from a regular app segment

| Concept | Regular segment | Browser Access segment |
|---|---|---|
| SDK / tool family | `zpa_*_application_segment` | `zpa_*_application_segment_ba` |
| Client requirement | ZCC required | Browser only |
| Per-app config block | none | **`common_apps_dto.apps_config` is required** |
| Per-app TLS cert | n/a | every published domain needs a `certificate_id` (a BA cert) |
| Typical ports | any TCP/UDP | almost always TCP 443 (HTTPS) or 80 (HTTP) |
| Access policy operand type | `APP` (segment ID) | `APP` (segment ID) — same |

The single biggest source of BA onboarding failures is forgetting one of:

1. The BA TLS certificate (`certificate_id`) for each published domain.
2. Listing the same domain in **both** the segment's `domain_names` and inside `apps_config[].domain`.

Both are validated client-side by `zpa_create_application_segment_ba` so the API doesn't have to.

---

## Workflow

Follow this 7-step process for complete BA application onboarding.

### Step 1: Gather Application Details

Collect the following from the administrator:

**Required:**

- Application name
- One or more public-facing domain names users will type into the browser (e.g. `hr.acme.com`, `intranet.acme.com`)
- Protocol per domain: `HTTP` or `HTTPS`
- Port per domain (almost always `443` for HTTPS, `80` for HTTP)
- Who should have access (users, groups, or departments)

**Optional:**

- Description and purpose of the application
- Geographic location of the application servers
- Whether to reuse existing ZPA resources (connector groups, server groups, segment groups, BA certificates)
- Health check requirements
- Whether CNAME resolution is needed

If the admin says "I want to publish X to the browser without installing the client" — this is BA. If they say "I want users on ZCC to reach X" — this is the regular flow, **stop and use `zpa-application_segment-onboard`**.

---

### Step 2: Set Up App Connector Group

Check for existing connector groups or create a new one. The same connector groups are used by regular and BA segments — there is no BA-specific connector group.

**List existing:**

```text
zpa_list_app_connector_groups()
```

**Create if needed:**

```text
zpa_create_app_connector_group(
  name="<location>-Connectors",
  description="Connectors serving <application_name>",
  enabled=True,
  latitude="<lat>",
  longitude="<lon>",
  location="<datacenter_or_office>",
  country_code="<country>"
)
```

The create tool already resolves the tenant's enrollment certificate ID automatically — no manual lookup needed.

Save the connector group `id` for the next step.

---

### Step 3: Set Up Server Group

Check for existing server groups or create a new one.

**List existing:**

```text
zpa_list_server_groups()
```

**Create if needed:**

```text
zpa_create_server_group(
  name="<application_name>-Servers",
  description="Server group for <application_name>",
  app_connector_group_ids=["<connector_group_id>"],
  enabled=True,
  dynamic_discovery=True
)
```

Save the server group `id` for Step 6.

---

### Step 4: Set Up Segment Group

Check for existing segment groups or create a new one.

**List existing:**

```text
zpa_list_segment_groups()
```

**Create if needed:**

```text
zpa_create_segment_group(
  name="<application_grouping>",
  description="Segment group for <application_grouping>",
  enabled=True
)
```

Save the segment group `id` for Step 6.

---

### Step 5: Look Up the BA TLS Certificate

Browser Access requires a **BA TLS certificate** per published domain (typically a wildcard cert covering the domain). This is the certificate the user's browser sees when they navigate to the published URL.

**List existing BA certificates:**

```text
zpa_list_ba_certificates()
```

Pick the cert whose Subject / SAN covers the domain(s) the admin wants to publish (e.g. a `*.acme.com` cert covers `hr.acme.com` and `intranet.acme.com`).

**If no suitable cert exists**, ask the admin for the cert + private key in PEM format and create one:

```text
zpa_create_ba_certificate(
  name="<short-cert-name>",
  cert_blob="-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----\n-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----"
)
```

Save the certificate `id` — every entry in `apps_config` will reference it (or a different cert, if different domains use different certs).

**Reusing one cert across multiple domains is normal** when the cert is a wildcard or has multi-SAN coverage. Each `apps_config[].certificate_id` can point to the same cert.

---

### Step 6: Create the Browser Access Application Segment

This is the BA-specific step. The `apps_config` block is **required** and must list one entry per domain in `domain_names`.

```text
zpa_create_application_segment_ba(
  name="<application_name>",
  description="<purpose>",
  enabled=True,
  segment_group_id="<segment_group_id>",
  server_group_ids=["<server_group_id>"],
  domain_names=["hr.acme.com", "intranet.acme.com"],
  tcp_port_range=[{"from": "443", "to": "443"}],
  apps_config=[
    {
      "domain": "hr.acme.com",
      "application_port": "443",
      "application_protocol": "HTTPS",
      "certificate_id": "<ba_certificate_id>"
    },
    {
      "domain": "intranet.acme.com",
      "application_port": "443",
      "application_protocol": "HTTPS",
      "certificate_id": "<ba_certificate_id>"
    }
  ],
  bypass_type="NEVER",
  health_check_type="DEFAULT",
  health_reporting="ON_ACCESS",
  is_cname_enabled=True
)
```

**Hard rules enforced client-side by the tool:**

- Every `apps_config[].domain` MUST appear in `domain_names`. The tool rejects mismatches before the API round-trip.
- `application_protocol` MUST be `"HTTP"` or `"HTTPS"`.
- `application_port`, `domain`, `application_protocol`, and `certificate_id` are all required per app.
- At least one of `tcp_port_range` / `tcp_port_ranges` / `udp_port_range` / `udp_port_ranges` must be supplied; for BA this is almost always TCP 443 or 80.

Save the segment `id` for Step 7.

---

### Step 7: Create the Access Policy Rule

Grant access to the BA segment.

**Look up the requesting principals:**

```text
zpa_list_segment_groups()        # confirm segment group ID
zpa_list_user_groups()            # for group-based access
zpa_list_idp()                    # find the IDP backing the criteria
zpa_list_scim_groups(idp_id="<idp_id>")  # for SCIM group-based criteria
```

**Create the access rule:**

```text
zpa_create_access_policy_rule(
  name="Allow <user_group> to <application_name> (BA)",
  description="Browser Access for <application_name>",
  action="ALLOW",
  conditions=[
    {
      "operands": [
        {"object_type": "APP", "values": ["<ba_segment_id>"]}
      ]
    },
    {
      "operands": [
        {
          "object_type": "SCIM_GROUP",
          "entry_values": [
            {"rhs": "<scim_group_id>", "lhs": "<idp_id>"}
          ]
        }
      ]
    }
  ]
)
```

The operand type for a BA segment is the same `APP` operand used for regular segments — the policy engine doesn't distinguish.

---

## Validation

After completion, confirm:

**Resource creation:**

```text
zpa_get_application_segment_ba(segment_id="<ba_segment_id>")
zpa_get_segment_group(group_id="<segment_group_id>")
zpa_get_server_group(group_id="<server_group_id>")
zpa_get_app_connector_group(group_id="<connector_group_id>")
```

The `get` response should include `common_apps_dto.apps_config` populated with each domain, port, protocol, and certificate.

**End-to-end test:**

1. From a browser belonging to a user in the access policy, navigate to one of the published domains.
2. The user is challenged through the IDP (SAML/OIDC) — **not** ZCC.
3. After auth, the page loads as if served by the internal app.

---

## Common Pitfalls

| Symptom | Cause | Fix |
|---|---|---|
| `apps_config[N].domain '...' is not present in the segment's domain_names` | Domain typo or omission | Make sure every domain in `apps_config` is also in `domain_names` |
| API returns generic `INVALID_INPUT` on create | Wrong `application_protocol` | Use literally `"HTTP"` or `"HTTPS"` (uppercase) |
| Browser shows a TLS warning when users hit the published URL | Wrong / missing BA certificate | Re-check the `certificate_id` covers the published domain (CN or SAN match) |
| 403 / no access despite policy | User isn't in the SCIM/user group | Verify the IDP and group membership; check the policy rule's `conditions` |
| Update silently dropped published apps | Supplied `apps_config` omitted a domain that previously existed | The SDK auto-deletes BA apps whose domain is no longer in `apps_config`. Re-include any domain you want to keep. |
| User sees the app but ZCC also tries to claim the domain | The same domain is also in a regular app segment | A domain may belong to **either** a BA segment or a regular segment, not both. Remove it from one. |

---

## Related Skills

- `zpa-application_segment-onboard` — onboard a regular (client-routed) application segment.
- `zpa-create-server-group` — focused workflow for just the server group step.
- `zpa-create-access-policy-rule` — focused workflow for just the policy rule step.

---

## Tool Reference

This skill uses:

- `zpa_list_app_connector_groups`, `zpa_create_app_connector_group`, `zpa_get_app_connector_group`
- `zpa_list_server_groups`, `zpa_create_server_group`, `zpa_get_server_group`
- `zpa_list_segment_groups`, `zpa_create_segment_group`, `zpa_get_segment_group`
- `zpa_list_ba_certificates`, `zpa_create_ba_certificate`, `zpa_get_ba_certificate`
- `zpa_list_application_segments_ba`, `zpa_create_application_segment_ba`, `zpa_get_application_segment_ba`, `zpa_update_application_segment_ba`
- `zpa_list_user_groups`, `zpa_list_idp`, `zpa_list_scim_groups`
- `zpa_create_access_policy_rule`

Files in this skill

  • PROVENANCE.json230 B
  • SKILL.md11.3 KB
  • UPSTREAM-LICENSE.txt1.1 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.