Skip to content

Deployment Guide

This guide explains how to run the ZeroEcho PKI platform as a pair of containers: an administrative API server that owns the certificate-authority state, and an nginx edge that serves the web console and terminates browser mutual-TLS. It covers the host prerequisites, the two container images, the data and configuration contract, a Kubernetes deployment, day-two operations, and the security model you must uphold at the edge.

What you will deploy

The platform runs as two cooperating containers on a private network:

  • The PKI server — a long-lived HTTPS service that holds the system of record: certificate authorities, requests, issued credentials, revocations, the metadata log, and the CA signing keyring. It exposes only a JSON API (administrative, public, and health routes) over a mandatory mutual-TLS listener. It does not serve any static web content.
  • The nginx edge — a stateless reverse proxy that serves the single-page web console bundle, terminates the administrator's browser client certificate, and forwards the verified client identity to the PKI server over its own mutual-TLS connection.

Administrators authenticate exclusively with an X.509 client certificate presented by their browser. There is no password or anonymous access path to the console.

The two-container topology

The browser presents an administrator client certificate to nginx. nginx verifies that certificate against the administrators' trust bundle, then forwards the verified leaf to the PKI server as an RFC 9440 Client-Cert header while authenticating upstream with its own transport client certificate. The PKI server runs in trusted-reverse-proxy mode and independently validates both identities before it maps the forwarded certificate to a persisted administrative principal.

flowchart LR
    browser["Administrator browser<br/>(client certificate)"]
    nginx["nginx edge<br/>serves the SPA<br/>terminates browser mTLS<br/>forwards RFC 9440 Client-Cert"]
    server["PKI server<br/>admin listener :8443<br/>trusted-reverse-proxy mode<br/>store + keyring + audit"]

    browser -- "HTTPS + browser mTLS<br/>(:8443)" --> nginx
    nginx -- "HTTPS + upstream mTLS<br/>+ Client-Cert header (:8443)" --> server

    subgraph state["Persistent POSIX volumes"]
        store[("store")]
        keyring[("keyring")]
        artifacts[("artifacts")]
        audit[("audit")]
    end

    server --- store
    server --- keyring
    server --- artifacts
    server --- audit

Only the nginx container is published to the host or cluster network. The PKI server's admin listener is reachable solely from within the private network shared by the two containers.

Why the identity is verified twice

nginx terminating the client certificate is a convenience, not a trust boundary the server relies on blindly. The PKI server re-validates the forwarded leaf against its own administrative client trust and requires the edge itself to present a trusted transport certificate. Neither container can be impersonated without possession of a private key trusted by the other.

How the guide is organised

Page What it covers
Requirements Host, filesystem, and container-runtime prerequisites; POSIX guarantees the store and keyring depend on.
Container images The two images, how to build or obtain them, and running the reference Compose stack.
Configuration The volume and environment contract: the store, keyring, artifacts, audit, config mounts, and secrets.
Kubernetes A StatefulSet with per-instance volumes, ConfigMaps, Secrets, Services, and probes.
Operations Health endpoints, backup and restore, upgrades, disaster recovery, and log handling.
Security hardening The mutual-TLS trust model, header-spoofing defences, response headers, and secret hygiene.

If you are new to the platform's concepts, read the architecture overview first. Once the stack is running, the Administrator Guide explains how to use the console.