Edge Configuration
The edge reads all of its configuration from environment variables at startup. Restart it after any change.
Settings
| Variable | Set in production | Default | Description |
|---|---|---|---|
OCTET_URL |
Yes | A local address | The Octet API. Set it to https://geo.octetproof.com. If it is unset, the edge still starts, but every session fails with 502 octet_unreachable. |
LICENSE |
Yes | Unset | Your license token, octet_live_v4.public.…. See Credentials. |
ALLOWED_ORIGIN |
Yes | * |
The origins allowed to call the edge from a browser, comma-separated with no spaces, for example https://www.example.com,https://app.example.com. Applies to both the POST and the WebSocket. The default * allows any origin, so always set it in production. |
PORT |
Yes | 8080 |
The TCP port to listen on. Use 443 in production. |
EDGE_TLS_CERT_FILE |
Yes | Unset | Path to your TLS certificate chain in PEM format, such as a Let's Encrypt fullchain.pem. |
EDGE_TLS_KEY_FILE |
Yes | Unset | Path to the matching private key in PEM format, such as privkey.pem. |
EDGE_DEBUG |
No | Off | 1 or true logs one line per request, including the end-user's IP address. Use it only for short diagnostic sessions, and never leave it on in production. |
EDGE_CLIENT_CERT_FILE |
Yes | Unset | Mutual TLS to Octet. Path to your edge's client certificate, downloaded from your license's Edge configuration tab in the Octet portal, under Certificates. |
EDGE_CLIENT_KEY_FILE |
Yes | Unset | Mutual TLS to Octet. Path to the client certificate's private key. |
EDGE_SIGNING_KEY |
Yes | Unset | The edge's signing key: a base64 32-byte Ed25519 key, from openssl rand -base64 32. The edge signs each session it forwards with it. Set only one of EDGE_SIGNING_KEY, EDGE_SIGNING_KEY_FILE and EDGE_SIGNING_KMS. If none is set, the edge forwards sessions unsigned and logs a warning at startup. See Edge signature. |
EDGE_SIGNING_KEY_FILE |
No | Unset | From v1.7.0. Path to a file holding the signing key, instead of EDGE_SIGNING_KEY, for example a systemd credential sealed to the host's TPM. See Where to keep the signing key. |
EDGE_SIGNING_KMS |
No | Unset | From v1.7.0. Sign in your cloud key service instead of on the host: aws:<key ARN> for AWS KMS or gcp:<key version name> for Google Cloud KMS. The key must be Ed25519. See Where to keep the signing key. |
EDGE_SIGNING_KID |
No | Derived from the public key | The signing key's ID, kid, which you register with the public key. Up to 64 letters, digits, ., _ or -. The default is edge- followed by a hash of the public key. |
OCTET_CA_FILE |
No | Unset | Path to a CA certificate that Octet's server certificate must chain to. If it is unset, the edge checks Octet's server certificate against the host's system trust store. |
The edge serves HTTPS only when both EDGE_TLS_CERT_FILE and EDGE_TLS_KEY_FILE are set. Without them it serves plain HTTP, which browsers will refuse to use from an HTTPS page. It accepts TLS 1.2 and 1.3, with modern AEAD cipher suites only. From v1.6.0 it serves HTTP/2 to browsers that offer it, and HTTP/1.1 to the rest. There is nothing to configure. It loads the certificate at startup, so restart it after each renewal.
Mutual TLS
The edge connects to Octet only over mutual TLS. It refuses to start if EDGE_CLIENT_CERT_FILE or EDGE_CLIENT_KEY_FILE is unset, or if OCTET_URL isn't https://. The one exception is an OCTET_URL on a loopback address, which is for local development. The log line names what is missing, for example OCTET_URL must be https:// (mTLS to octet is required). To get the certificate, see Deploy the Edge.
Octet's server certificate is a public certificate, so the edge verifies it with the host's system trust store. You don't need Octet's client CA certificate. Set OCTET_CA_FILE only if your security policy requires pinning Octet's server certificate to a specific CA.
The edge loads the client certificate and key at startup, so restart it after you renew them.
Edge signature
With EDGE_SIGNING_KEY set, the edge signs each session it forwards to Octet. The signature covers the collection and everything the edge adds about the connection. At startup the edge logs the key's kid and public key:
[octet-edge] S2 signing on: kid=edge-… ed25519 public key=… (register it in the licence portal)
Register both in your license's Edge configuration tab in the Octet portal, under Signing keys. If the value isn't a base64 32-byte key, the edge exits and logs EDGE_SIGNING_KEY must be a base64 32-byte Ed25519 seed.
Octet refuses a session whose signature fails its check. From v1.5.0, Octet also refuses an unsigned session, or one signed by a key that isn't registered for your license. The reason codes are in Errors. The signing key and the client certificate are separate credentials, and the edge needs both. See Credentials.
Where to keep the signing key
Anyone who has the signing key can sign sessions for your license until you revoke it. From v1.7.0 the edge can read it from three places. Set only one:
| Setting | Where the key is | Use it for |
|---|---|---|
EDGE_SIGNING_KEY |
In the edge's environment file, in plain text | Development and tests |
EDGE_SIGNING_KEY_FILE |
In a file, for example a systemd credential encrypted to the host's TPM, which only the edge's service can read while it runs | Production edges. This is the recommended setting |
EDGE_SIGNING_KMS |
In AWS KMS or Google Cloud KMS. It never reaches the host | When your policy allows no private keys on hosts |
Keep the client certificate's key, EDGE_CLIENT_KEY_FILE, under the same protection as the signing key. Octet needs both, so protecting only one protects less than it seems. EDGE_CLIENT_KEY_FILE and EDGE_TLS_KEY_FILE are paths too, so they can be systemd credentials as well.
A key sealed to the TPM. This needs systemd 250 or later and a TPM 2.0. On cloud VMs that means a GCP Shielded VM, AWS NitroTPM or Azure Trusted Launch. The encrypted file can't be used on any other machine. As root on the edge host:
mkdir -p /etc/credstore.encrypted
openssl rand -base64 32 | systemd-creds encrypt --with-key=tpm2 --name=edge-s2-key - /etc/credstore.encrypted/edge-s2-key
Then remove the EDGE_SIGNING_KEY= line from the environment file, add this with systemctl edit octet-edge, and restart the edge:
[Service]
LoadCredentialEncrypted=edge-s2-key:/etc/credstore.encrypted/edge-s2-key
Environment=EDGE_SIGNING_KEY_FILE=edge-s2-key
The startup log shows S2 signing on (file …): kid=… ed25519 public key=…. A new key needs registering in the portal. A TPM reset or a new VM means a new key. Don't run systemd-creds decrypt on the host, because it prints the key.
A key in your cloud key service. The edge uses the instance's own identity:
- AWS KMS: create an asymmetric key with key spec
ECC_NIST_EDWARDS25519and usageSIGN_VERIFY, in the edge's region. Give the instance rolekms:Signandkms:GetPublicKeyon it. SetEDGE_SIGNING_KMS=aws:arn:aws:kms:<region>:<account>:key/<id>. - Google Cloud KMS: create a key with purpose
ASYMMETRIC_SIGNand algorithmEC_SIGN_ED25519, in the edge's region. Give the VM's service accountroles/cloudkms.signerVerifieron it. SetEDGE_SIGNING_KMS=gcp:projects/<p>/locations/<l>/keyRings/<r>/cryptoKeys/<k>/cryptoKeyVersions/<n>.
At startup the edge fetches the public key, checks that it is Ed25519 and that it may sign with it, and logs the kid and public key to register. Each session waits for one call to the key service, so keep the key in the edge's region. If a call fails or takes longer than 1 second, the edge answers the browser with 503 and edge_signing_failed, and sends nothing to Octet. It never forwards a session unsigned.
Prove you hold the signing key
From v1.7.0 the Octet portal asks you to prove each signing key you register. In your license's Edge configuration tab, under Signing keys, select Prove next to the key. The portal shows a one-time challenge, valid for 30 minutes. On the edge host, with the same key settings as the running edge, run:
octet-edge prove-key --challenge <the challenge from the portal>
It prints one line. Paste it into the portal. The command doesn't start the edge. It refuses a challenge for another key, or one that has expired, and says why. Keys you registered before v1.7.0 can be proven the same way.
Today a key that isn't proven still works. Octet will refuse sessions signed with an unproven key from a date it announces in advance, so prove each key now.
Testing only
The edge also reads two settings meant for testing. Leave both unset in production.
| Variable | Effect |
|---|---|
EDGE_EXPOSE_VERDICT |
1 or true makes the edge answer the collector's POST with the verdict's country, confidence and alarm instead of {"ok":true}. The signed token is never included. |
EXIT_IP |
Replaces the user's IP address with this value for every session. It is for local tests where the browser reaches the edge over loopback. |
Endpoints
| Method | Path | Called by | Response |
|---|---|---|---|
GET |
/health |
You, for monitoring | 200 {"ok":true,"role":"octet-edge"}. Does not contact Octet. |
POST |
/v1/signals |
The collector | 200 {"ok":true} when Octet accepted the session. Errors are in Errors. |
GET |
/v1/ws |
The collector | A WebSocket upgrade. It stays open for at most 15 seconds. |
OPTIONS |
/v1/signals |
The browser, for CORS | 204 with the CORS headers. |
The edge serves every path at its root, so apiUrl is the edge's origin with no path, for example https://octet.example.com.
Ports and connections
| Direction | Protocol and port | Peer |
|---|---|---|
| Inbound | TCP 443 | Browsers, for HTTPS and the WebSocket |
| Outbound | TCP 443 | geo.octetproof.com |
The edge must accept the browser's TCP connection directly. See Deploy the Edge.
Binaries
Each release contains static Linux binaries with no runtime dependencies:
| File | Platform |
|---|---|
octet-edge-linux-amd64 |
Linux on x86-64 |
octet-edge-linux-arm64 |
Linux on 64-bit ARM |
Check each binary against the release's SHA256SUMS before you install it. See Deploy the Edge. The edge runs only on Linux.