Private certificate authority and ACME server for internal TLS
CIS Level 1 hardened Ubuntu 24.04 LTS image by Lynxroute · unique credentials at first boot · CVE-scanned · SBOM and CIS report inside
| Cloud | Version | Software price | Last build | |
|---|---|---|---|---|
| Azure Marketplace VM image · plan payg-gen2 · Gen2 | 0.30.2 | $0.028/vCPU/hr Recommended VM: Standard_D2s_v3 | 2026-08-03 | Listing ↗ |
Software price only; cloud infrastructure is billed separately by the provider. Prices in USD.
| Base OS | Ubuntu 24.04 LTS |
| Hardening | CIS Level 1, Ubuntu 24.04 LTS (tailored) |
| License | Apache-2.0 |
| Upstream | Smallstep Labs, Inc. |
| Machine-readable | product.json · catalog.json |
step-ca is a private online certificate authority from Smallstep, shipped here as a single statically linked Go binary. It issues short-lived X.509 certificates for internal services over its own REST API and over ACME, so any standard ACME client works against it, including Certbot, acme.sh, lego, Caddy, Traefik and cert-manager. It supports token-based issuance through a JWK provisioner, certificate renewal over mutual TLS, and revocation. All state - issued certificates and ACME accounts - persists in an embedded Badger key-value store on the instance, so there is no database server to run, patch or back up separately. Public certificate authorities will not issue for internal host names or private IP addresses; running your own means real TLS on internal services, on names and lifetimes you choose, with the root key under your control. Apache-2.0 license, no vendor lock-in.
Security hardening:
OS hardening (CIS Level 1):
Compliance artifacts:
IMPORTANT - HOW ACME ACCESS IS CONTROLLED
Certificate requests through the token provisioner always require the provisioner password. Certificate requests through ACME are not individually authenticated: anything that can reach port 443 on this instance can be issued a certificate by this CA. Restrict inbound 443 to the networks allowed to enrol, or remove the ACME provisioner with the single command given in the credentials file on the instance.
Credentials are generated at first boot and written to /root/step-ca-credentials.txt.
# accept the plan terms once, then:
az vm image terms accept --publisher lynxroute --offer step-ca --plan payg-gen2
az vm create -g my-rg -n step-ca --size Standard_D2s_v3 \
--image lynxroute:step-ca:payg-gen2:latest --admin-username azureuser --generate-ssh-keys
The most recent release with notes; the full release history is in product.json.