Skip to content

GUIDES · 09

Enterprise networks.

Corporate proxies with Transport Layer Security (TLS) inspection and self-signed roots are a first-class deployment, not a workaround. The operator tells tebako how to reach the network (the proxy half) and what to trust (the roots half); both halves are one environment variable or three lines of config.yaml.

The two halves.

Everything tebako downloads — runtimes, payloads, registry indexes — uses one in-process HTTPS client. Getting through an enterprise network always comes down to the same two questions:

  1. Reach the network. The operator names the proxy the connections go through.

  2. Trust the answer. The operator chooses the root certificates that verify the TLS connection, which matters especially when the proxy inspects (re-encrypts) traffic with the organization’s own root CA.

Both questions are answered by environment variables or by the network: section of ~/.tebako/config.yaml. The environment always wins, per key. There is no "disable verification" setting and there never will be — a wrong answer fails closed with a named error, never a silent fallback.

Reach the network: the proxy.

The standard spellings work, uppercase or lowercase:

$ export HTTPS_PROXY=http://proxy.corp:3128
$ export NO_PROXY=localhost,127.0.0.1,.internal.corp   # comma list; * and .suffix work
$ tebako install metanorma

or the same policy in config:

# ~/.tebako/config.yaml
network:
  proxy: http://proxy.corp:3128

Precedence is HTTPS_PROXY → HTTP_PROXY → ALL_PROXY → network.proxy → direct. HTTPS connections tunnel through the proxy via CONNECT, and TLS still terminates at the target host — an inspecting proxy re-encrypts, which is exactly what the trust half below is for.

Proxy authentication uses credentials embedded in the URL (http://user:pass@proxy.corp:3128). Credentials never reach the log: the audit journal records proxy=http://*@proxy.corp:3128. A proxy that rejects them answers with the named ProxyAuthRequired error (HTTP 407). SOCKS proxies are not supported and are refused by name.

Trust the answer: three spellings.

1. The default (bundled Mozilla roots). Nothing requires configuration, and the spelling works wherever the proxy passes TLS through untouched.

2. The platform store — for roots the organization’s IT department pushes by Group Policy Object (GPO) / mobile device management (MDM) into the operating system’s own trust store (Windows certificate store, macOS keychain, the Linux CA bundle). One environment variable arms it:

$ export TEBAKO_TLS_PLATFORM_ROOTS=1

or in config:

network:
  tls_roots: platform

3. Additive PEMs — the bundled Mozilla roots are kept, and the organization’s root is additionally trusted from a Privacy-Enhanced Mail (PEM) file:

$ export TEBAKO_EXTRA_CA=/etc/pki/corp-root.pem    # os-path-list; several files allowed
network:
  extra_ca: [/etc/pki/corp-root.pem]

The additive and platform spellings do not combine — the OS verifier trusts exactly the OS store, so tls_roots: platform together with extra_ca is a named error that directs the operator to push the CA into the OS store instead. A PEM that is unreadable or does not parse is a named error at startup, never a silently skipped file.

What was decided.

Every process that fetches writes its network policy to the audit journal, ~/.tebako/journal.log:

1788670000 event=network-config proxy=http://***@proxy.corp:3128 (/home/u/.tebako/config.yaml)
1788670000 event=network-config extra_ca=1 file(s) (/home/u/.tebako/config.yaml)

Fleet tooling can scrape the journal to prove which machines run with which policy.

The packaged application’s own connections.

The settings above govern tebako’s downloads. A packaged application making its own TLS connections (Ruby’s net/http, Python’s requests, and similar clients) is a separate surface: it reads the runtime’s usual variables, and a payload image can ship its own CA bundle that the driver exports as SSL_CERT_FILE at boot (a mounted ssl/cert.pem marked for materialization). The organization’s root can travel inside the payload itself — no host configuration needed. The runtime’s own tooling conventions (REQUESTS_CA_BUNDLE, SSL_CERT_FILE, and similar variables) apply unchanged.

Fully offline fleets.

For sites with no outbound access at all, this guide pairs with Curate a local library: one team mirrors the needed artifacts into a directory registry (file:///), and every machine installs from it. TEBAKO_OFFLINE=1 turns any accidental network reach into a hard error instead of a leak.

The one exception.

The size-gated bootstrap (the first bytes of a standalone packaged executable) deliberately ships without the proxy/additive-CA machinery to stay under its 3 MiB gate. It always honors TEBAKO_TLS_PLATFORM_ROOTS; pointed at a proxy or TEBAKO_EXTRA_CA, it stops with the named NetworkingCompiledOut error instead of guessing. The fix on such machines is the toolchain path — tebako install and the shims — which carries the full surface, or the platform-store spelling, which works everywhere.