CA & Certificate Infrastructure
Certificate strategy, issuer boundaries, inventory, network policy, and deployment order for public ACME and private step-ca certificates.
Let's Encrypt certificates issued through Cloudflare DNS-01 cover browser-facing services without inbound challenge traffic. A narrowly scoped private step-ca instance covers IPMI/BMC firmware and optional internal mTLS where public ACME is unsuitable.
Issuer Boundary
aorxi.io is hosted on Cloudflare, so DNS-01 can validate internal names under core.aorxi.io without publishing the corresponding A records or opening an HTTP challenge path. Publicly trusted roots avoid private-root distribution for most services.
IPMI/BMC firmware cannot run an ACME client. step-ca provides certificates for those interfaces and may later issue short-lived client certificates for service-to-service mTLS.
| Decision | Choice |
|---|---|
| Primary certificate strategy | Let's Encrypt via Cloudflare DNS-01 |
| Public domain | aorxi.io |
| Internal zone | core.aorxi.io; Technitium serves internal records |
| Private CA | step-ca on sa-ca-01 (10.10.30.30) for IPMI/BMC and optional mTLS only |
| Kubernetes issuance | cert-manager ClusterIssuer per cluster |
| Non-Kubernetes issuance | OPNsense os-acme-client; acme.sh on Proxmox/PBS |
| Root trust | Let's Encrypt is already trusted; distribute the private root only to managed clients that need it |
Runbooks
Public ACME
Private step-ca
sa-ca-01, issue IPMI certificates, distribute trust, renew certificates, and protect CA state.Certificate Inventory
| Service | Issuer | Hostname | Renewal |
|---|---|---|---|
| OPNsense Site A | Let's Encrypt | sa-fw-01.core.aorxi.io | Auto (os-acme-client) |
| OPNsense Site B | Let's Encrypt | sb-fw-01.core.aorxi.io | Auto (os-acme-client) |
Proxmox sa-edge-01 | Let's Encrypt | sa-edge-01.core.aorxi.io | Auto (acme.sh cron) |
Proxmox sa-cmp-01 | Let's Encrypt | sa-cmp-01.core.aorxi.io | Auto (acme.sh cron) |
Proxmox sa-cmp-02 | Let's Encrypt | sa-cmp-02.core.aorxi.io | Auto (acme.sh cron) |
Proxmox sa-stor-01 | Let's Encrypt | sa-stor-01.core.aorxi.io | Auto (acme.sh cron) |
Proxmox sb-edge-01 | Let's Encrypt | sb-edge-01.core.aorxi.io | Auto (acme.sh cron) |
Proxmox sb-cmp-01 through sb-cmp-05 | Let's Encrypt | sb-cmp-0x.core.aorxi.io | Auto (acme.sh cron) |
PBS sa-pbs-01 | Let's Encrypt | sa-pbs-01.core.aorxi.io | Auto (acme.sh cron) |
| Kubernetes wildcard Site A | Let's Encrypt | *.core.aorxi.io | Auto (cert-manager) |
| Kubernetes wildcard Site B | Let's Encrypt | *.core.aorxi.io | Auto (cert-manager) |
IPMI sa-edge-01 | step-ca | ipmi-sa-edge-01.core.aorxi.io | Manual/yearly |
IPMI sa-stor-01 | step-ca | ipmi-sa-stor-01.core.aorxi.io | Manual/yearly |
IPMI sb-edge-01 | step-ca | ipmi-sb-edge-01.core.aorxi.io | Manual/yearly |
IPMI sb-cmp-01 through sb-cmp-05 | step-ca | ipmi-sb-cmp-0x.core.aorxi.io | Manual/yearly |
Network Policy
DNS-01 is outbound only. ACME clients require TCP 443 to acme-v02.api.letsencrypt.org and api.cloudflare.com; no inbound challenge rule is required.
| Proto | Source | Destination | Port | Purpose |
|---|---|---|---|---|
| TCP | VLANs 10, 20, 100 | 10.10.30.30 | 9000 | Private certificate issuance API |
| TCP | 10.20.30.0/24 | 10.10.30.30 | 9000 | Cross-site issuance over WireGuard |
Keep the Private CA Internal
Port 9000 on sa-ca-01 must never be reachable from the internet. Limit access to trusted administration networks and approved Site B traffic over WireGuard.
Deployment Order
- Provision
sa-ca-01after Technitium DNS is available. - Initialize
step-ca, add its DNS record, and distribute its root to managed clients that require private trust. - Issue and upload IPMI certificates.
- Configure
acme.shon Proxmox and PBS, then verify initial issuance. - Configure
os-acme-clienton both OPNsense instances. - Deploy cert-manager and
ClusterIssuerresources only after Kubernetes clusters exist. - Add expiry monitoring and verify every renewal path.
IPMI remains usable with self-signed certificates before the private CA is deployed; private issuance is a day-2 improvement.
Related Pages
- DNS VMs: internal records for certificate hostnames
- IPMI / KVM: BMC access where private certificates are installed
- Build Phases: dependency order for DNS, certificates, and Kubernetes
- IP Tables:
sa-ca-01address allocation
Container & Build Infrastructure
Docker Compose setup for running Supermicro Java iKVM on ARM/macOS hosts: build approach, known errors, and SMB file sharing for IPMI virtual media.
Public ACME Runbook
Cloudflare DNS-01 setup and Let's Encrypt issuance for OPNsense, Proxmox, PBS, and planned Kubernetes workloads.