LESSON 3 OF 5 · DEPLOYMENT ARCHITECTURE

Day 1 lives or dies at the proxy

By the end of this lesson you can configure Claude Code for a proxied, TLS-inspected corporate network and hand the client's network team the exact allowlist they'll ask for.

Where installs break

The first support ticket of every enterprise activation is a network ticket

The activation plan calls it "setup support: confirm blockers prior to kickoff." In practice it means one thing: find out what sits between the developer's terminal and the model endpoint before forty people install at once.

Two different components can sit in that path, and they solve different problems. A corporate proxy routes outbound traffic through the client's network perimeter for monitoring and policy enforcement; you configure Claude Code to pass through it. An LLM gateway sits in front of the model provider to handle auth, budgets, and usage attribution; that's Lesson 3.4. They stack: plenty of clients run both. This lesson is the perimeter half, and it's pure pre-kickoff work, because the failure mode is forty developers with hanging terminals in the first hour of Week 1.

Corporate proxy · This lesson
Gets traffic out of the building
The client's existing network perimeter: HTTP/HTTPS proxy, TLS inspection, firewall allowlists. Claude Code respects the standard proxy environment variables. Owned by the network and security teams.
LLM gateway · Lesson 3.4
Controls what happens to model traffic
Centralized auth, usage tracking, budgets, audit. A service the client deploys deliberately, not perimeter plumbing they already have. Configured through base-URL overrides rather than proxy variables.
Next: The proxy variables
 
Back: Where installs break
 
The proxy variables

Four environment variables cover most networks

Configuration detail ahead: developers and architects, this is yours. Business-facing consultants can skip to Topic 4, where the allowlist conversation lives.

# Route Claude Code through the corporate proxy export HTTPS_PROXY=https://proxy.client.com:8080 # HTTP fallback if the proxy has no HTTPS endpoint export HTTP_PROXY=http://proxy.client.com:8080 # Keep internal hosts off the proxy (comma- or space-separated) export NO_PROXY="localhost,.client.com,169.254.169.254" # Proxy requires basic auth? Credentials go in the URL -- # from a secrets manager, never hardcoded in a script export HTTPS_PROXY=http://user:pass@proxy.client.com:8080

Proxy env vars are OS-level and cannot be set via Claude Code's settings files. To deploy them org-wide, use MDM: Jamf or Kandji on macOS, Windows registry policy on Windows. Two boundaries to know before the client asks:

  • Rule out SOCKS proxies: not supported; if the client runs SOCKS for other engineering tools, it's not a viable path for Claude Code
  • Escalate NTLM or Kerberos auth to the gateway: Claude Code can't speak either protocol directly; an LLM gateway that handles enterprise auth becomes the answer, which is one more reason 3.4 matters
Next: TLS inspection and trust
 
Back: The proxy variables
 
TLS inspection and trust

"Self-signed certificate in chain" means the proxy is working as designed

TLS-inspecting proxies like Zscaler or Netskope re-sign traffic with the corporate root CA. Claude Code trusts the OS system trust store by default, so on a well-managed fleet this usually just works.

When it doesn't, the corporate root certificate isn't where Node can see it. The fix is to point at it directly, not to disable verification. Any suggestion of turning off TLS checks fails the client's own security review, and it should.

# Trust the corporate root CA directly export NODE_EXTRA_CA_CERTS=/etc/ssl/corp-root-ca.pem # Control which trust stores are used (default: system) export CLAUDE_CODE_CERT_STORE=system # Client-certificate (mTLS) environments export CLAUDE_CODE_CLIENT_CERT=/path/to/client-cert.pem export CLAUDE_CODE_CLIENT_KEY=/path/to/client-key.pem
Next: The allowlist conversation
 
Back: TLS inspection and trust
 
The allowlist conversation

"Which domains does this thing need?" deserves a prepared answer

The network team will ask. Handing them the list in the first meeting, with rationale per domain, is the difference between a same-week approval and a three-week change request.

Model and API
api.anthropic.com
Claude API requests on the direct path, and the WebFetch domain safety check on every path. Block it on a Bedrock deployment and WebFetch fails even though model traffic flows fine, unless settings disable the preflight.
Authentication
claude.ai · platform.claude.com
Account authentication for claude.ai and Console accounts respectively. On Bedrock, Vertex, and Foundry, auth goes to the cloud provider instead, so these mostly matter on the direct path.
Distribution
downloads.claude.ai
Native installer, auto-updater, and plugin executable downloads. Clients that distribute Claude Code through their own artifact registry can often skip this for end users.
Cloud paths
Provider endpoints instead
On Bedrock, Vertex, or Foundry, model and auth traffic go to the provider's endpoints, which are usually already reachable. Optional telemetry to Anthropic defaults off, as flagged in 3.2. Verify the final posture with /status inside Claude Code.

Once the allowlist is approved, the next question from IT is usually: "How do we make sure every developer uses the right configuration?" That is what managed settings is for.

What it is
The org-level policy layer
managed-settings.json sits at the top of Claude Code's settings hierarchy, above user and project settings. Rules set here cannot be overridden by individual developers. Use it to lock permissions, enforce allowed MCP servers, require SSO login, and pin version floors across the org.
How it reaches developer machines
Three delivery paths
Server-managed via the Anthropic admin console, Enterprise only. MDM/OS-level via plist on macOS or registry on Windows; deploy through Jamf, Kandji, or similar. File-based: write managed-settings.json to the system directory for the OS. All three require admin rights, which is the point.
Next: Scenario: the install clinic
 
Back: The allowlist conversation
 
Scenario · The install clinic

Forty terminals at Halvern Bank, all hanging

Week 1, Day 1. The kickoff went well, the install session is now, and nothing connects. Four decisions, eight points.

 
Simulation
Halvern Bank · Day-one install clinic

Click a card to commit. Choices lock, consequences land. Green is a strong call, orange is defensible, grey costs you the room.

Credibility · 0 / 8
 
 
 
 
1
Decision 1 of 4 · Everything hangs
Every developer's first prompt spins forever. Forty people, one hour booked, zero working installs. Your first move?
Choose your move
A
Get the network team on the call
Ask the two questions that matter: does outbound traffic transit a proxy, and is TLS inspection on? Everything every terminal does next depends on those answers.
Select
B
Have everyone uninstall and reinstall
Forty identical failures suggest a bad build. A clean reinstall rules it out fastest.
Select
C
Test one laptop on a phone hotspot
If it works off the corporate network, you've isolated the problem to the perimeter in five minutes.
Select
 
2
Decision 2 of 4 · Proxy confirmed
The network team confirms: all outbound traffic transits proxy.halvern.net:8080. How do you roll out the fix to forty machines?
Choose your move
A
Post export commands in the channel
Everyone adds HTTPS_PROXY to their shell profile. Works within the hour for whoever does it right.
Select
B
Push HTTPS_PROXY and NO_PROXY via MDM
Proxy env vars are OS-level; deploy via Jamf or Kandji on macOS, registry policy on Windows. Every existing machine picks it up, and new machines get it on enroll.
Select
C
Ask for the SOCKS endpoint instead
Halvern also runs a SOCKS5 proxy for engineering tools; point Claude Code at that and skip the HTTP proxy entirely.
Select
 
3
Decision 3 of 4 · The certificate error
Proxy configured, new error: "self-signed certificate in certificate chain." A developer suggests a flag he found on Stack Overflow: NODE_TLS_REJECT_UNAUTHORIZED=0.
Choose your move
A
Use the flag as a temporary unblock
It gets forty people working today. Swap in the proper fix once the clinic is over.
Select
B
Point NODE_EXTRA_CA_CERTS at the corporate root CA
The TLS-inspecting proxy is re-signing traffic; trust its root certificate explicitly and ship that in the same managed settings block.
Select
C
Request a TLS-inspection bypass for the API domains
Ask the network team to exempt api.anthropic.com from inspection. Legitimate, but it's a security change request with its own approval cycle.
Select
 
4
Decision 4 of 4 · Security wants the list
Installs work. Halvern's security lead asks for "the definitive list of every domain this tool talks to," in writing, before wave two.
Choose your move
A
Send the allowlist with rationale per domain
API, auth, and download domains, each with its purpose, plus the WebFetch preflight nuance and which telemetry endpoints are optional and how to disable them.
Select
B
Suggest allowing *.anthropic.com and *.claude.ai
Wildcards cover whatever the product needs now and later, and it's one line in the proxy config.
Select
C
Tell them it's all standard HTTPS on port 443
It rides the same rails as any SaaS tool; no special firewall treatment needed.
Select
 
Engagement debrief
0 / 8
The path you took
LESSON 3 OF 5 COMPLETE

Traffic gets out of the building. Now govern it.

 

Proxy posture is pre-kickoff work: HTTPS_PROXY deployed via MDM, the corporate root CA trusted explicitly, and an allowlist the network team can approve in one reading.

UP NEXT · LESSON 4
The LLM gateway pattern

Centralized auth, per-team budgets, and the usage attribution that unblocks the CoE metrics review, designed once for every developer.