mirror of
https://github.com/NVIDIA/OpenShell.git
synced 2026-10-17 05:31:16 +08:00
118 lines
5.2 KiB
Plaintext
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
|
|
```
|