Files
OpenShell/docs/reference/gateway-auth.mdx

118 lines
5.2 KiB
Plaintext

---
# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
title: "Gateway Authentication"
description: "Gateway resolution, authentication modes, connection flow, and credential file layout."
keywords: "Generative AI, Cybersecurity, Gateway, Authentication, mTLS, Edge Authentication, Reference"
position: 1
---
This page describes how the CLI resolves a gateway, authenticates with it, and where credentials are stored. For how to deploy or register gateways, refer to [Gateways](/sandboxes/manage-gateways).
## Gateway Resolution
When any CLI command needs to talk to the gateway, it resolves the target through a priority chain:
1. `--gateway-endpoint <URL>` flag (direct URL).
2. `-g <NAME>` flag.
3. `OPENSHELL_GATEWAY` environment variable.
4. Active gateway from `~/.config/openshell/active_gateway`.
The CLI loads gateway metadata from disk to determine the endpoint URL and authentication mode.
## Authentication Modes
The CLI uses one of three connection modes depending on the gateway's authentication configuration.
### mTLS
The default mode for self-managed gateways. Every CLI request presents a client certificate to prove identity. Kubernetes Helm deployments provide the server certificate, client CA, and client certificate bundle through Kubernetes secrets. Standalone Docker, Podman, and MicroVM-backed gateways provide equivalent certificate files through their runtime configuration.
The CLI loads three PEM files from `~/.config/openshell/gateways/<name>/mtls/`:
| File | Purpose |
|---|---|
| `ca.crt` | CA certificate. Verifies the gateway's server certificate. |
| `tls.crt` | Client certificate. Proves the CLI's identity to the gateway. |
| `tls.key` | Client private key. |
The connection flow:
1. The CLI loads the three certificate files.
2. Opens a TCP connection to the gateway endpoint.
3. Performs a TLS handshake, presenting the client certificate.
4. The gateway verifies the client certificate against its CA.
5. An HTTP/2 channel is established. All CLI commands use this channel.
For Helm deployments, create these Kubernetes secrets before installing the chart:
```shell
kubectl -n openshell create secret tls openshell-server-tls \
--cert server.crt \
--key server.key
kubectl -n openshell create secret generic openshell-server-client-ca \
--from-file=ca.crt=ca.crt
kubectl -n openshell create secret generic openshell-client-tls \
--from-file=ca.crt=ca.crt \
--from-file=tls.crt=client.crt \
--from-file=tls.key=client.key
```
The same `ca.crt`, `client.crt`, and `client.key` files must be placed in the CLI mTLS directory as `ca.crt`, `tls.crt`, and `tls.key`.
### Edge JWT (cloud gateways)
For gateways behind a reverse proxy that handles authentication (e.g. Cloudflare Access), the CLI uses a browser-based login flow and routes traffic through a WebSocket tunnel.
**Registration flow** (`openshell gateway add https://gateway.example.com`):
1. The CLI stores gateway metadata with the edge authentication mode.
2. Opens your browser to the gateway's authentication endpoint.
3. The reverse proxy handles login (SSO, identity provider, etc.).
4. After authentication, the browser relays the authorization token back to the CLI via a localhost callback.
5. The CLI stores the token and sets the gateway as active.
**Connection flow** (subsequent commands):
1. The CLI starts a local proxy that listens on an ephemeral port.
2. The proxy opens a WebSocket connection (`wss://`) to the gateway, attaching the stored bearer token in the upgrade headers.
3. The reverse proxy authenticates the WebSocket upgrade request.
4. The gateway bridges the WebSocket into the same service that handles direct mTLS connections.
5. CLI commands send requests through the local proxy as plaintext HTTP/2 over the tunnel.
This is transparent to the user. All CLI commands work the same regardless of whether the gateway uses mTLS or edge authentication.
**Re-authentication**: If the token expires, run `openshell gateway login` to open the browser flow again and update the stored token.
### Plaintext
When a gateway is deployed with `server.disableTls=true`, TLS is disabled entirely. The CLI connects over plain HTTP/2. This mode is intended for local port-forwarding or gateways behind a trusted reverse proxy or tunnel that handles TLS termination externally.
Register a plaintext gateway with an explicit `http://` endpoint:
```shell
openshell gateway add http://127.0.0.1:8080 --local
```
This stores the gateway with `auth_mode = plaintext`, skips mTLS certificate extraction, and does not open the browser login flow.
## File Layout
All gateway credentials and metadata are stored under `~/.config/openshell/`:
```text
openshell/
active_gateway # Plain text: active gateway name
gateways/
<name>/
metadata.json # Gateway metadata (endpoint, auth mode, type)
mtls/ # mTLS bundle (local and remote gateways)
ca.crt # CA certificate
tls.crt # Client certificate
tls.key # Client private key
edge_token # Edge auth JWT (cloud gateways)
last_sandbox # Last-used sandbox for this gateway
```