Catalog / Security & identity

step-ca

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

Availability and pricing
CloudVersionSoftware priceLast build
Azure Marketplace
VM image · plan payg-gen2 · Gen2
0.30.2$0.028/vCPU/hr
Recommended VM: Standard_D2s_v3
2026-08-03Listing ↗

Software price only; cloud infrastructure is billed separately by the provider. Prices in USD.

Image facts
Base OSUbuntu 24.04 LTS
HardeningCIS Level 1, Ubuntu 24.04 LTS (tailored)
LicenseApache-2.0
UpstreamSmallstep Labs, Inc.
Machine-readableproduct.json · catalog.json
What is step-ca

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.

What the Lynxroute image adds

Security hardening:

  • Root and intermediate CA keys, and the passwords protecting them, are generated on your own instance at first launch - nothing is baked into the image, so no two deployments share a certificate authority
  • Token-based issuance is gated by a 24-character random password generated per instance
  • Certificates issued over ACME are capped at a 24 hour lifetime, which keeps renewal automated and limits exposure
  • Remote provisioner management is switched off, so no management API is served
  • No plaintext listener is configured; TLS 1.2 is the floor and renegotiation is disabled
  • The service runs as a dedicated non-root user under a read-only filesystem namespace, with writes limited to its database and log, and only the single capability it needs to bind port 443
  • The generated root certificate is installed into the instance trust store, so local tooling trusts the new CA immediately
  • UFW firewall pre-configured - inbound limited to SSH on 22 and the CA API on 443
  • fail2ban and AppArmor pre-configured
  • CVE scan - every image is scanned for vulnerabilities before release

OS hardening (CIS Level 1):

  • CIS Ubuntu 24.04 LTS Level 1 benchmark applied via ansible-lockdown
  • auditd, SSH hardening, Kernel hardening, IMDSv2 enforced

Compliance artifacts:

  • SBOM - CycloneDX 1.6 at /etc/lynxroute/sbom.json
  • CIS Conformance Report at /etc/lynxroute/cis-report.html
  • CIS Tailored Profile at /usr/share/doc/lynxroute/CIS_TAILORED_PROFILE.md

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.

Deploy

Launch in one command

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
Release notes

Latest release

The most recent release with notes; the full release history is in product.json.

step-ca 0.30.2 - Initial release (August 2026)

Azure · 2026-08-03
  • step-ca 0.30.2 on Ubuntu 24.04 LTS, with the step CLI 0.30.6 included
  • CIS Level 1 hardening applied (ansible-lockdown/UBUNTU24-CIS)
  • CVE-scanned before every release
  • Root and intermediate CA keys generated on the instance at first launch, never baked into the image
  • Token provisioner gated by a 24-character random password unique to the instance
  • ACME provisioner enabled, issued certificates capped at a 24 hour lifetime
  • No plaintext listener and no management API exposed; TLS 1.2 floor, renegotiation disabled
  • Service runs as a dedicated non-root user with a read-only filesystem namespace
  • UFW firewall pre-configured (ports 22, 443 only)
  • fail2ban, auditd, AppArmor pre-configured
  • SBOM (CycloneDX 1.6) at /etc/lynxroute/sbom.json
  • CIS Conformance Report (OpenSCAP) at /etc/lynxroute/cis-report.html
  • IMDSv2 enforced