Dev Tools
中文

ReactorCA: Finally, a TLS Certificate Authority That Doesn't Suck for Homelabs

A hands-on review of ReactorCA, a lightweight Go CLI tool for managing homelab Certificate Authorities with age-encrypted private keys and automated deployment.

gocertificatetlshomelab

[广告位: article-top] 请在 .env 中配置至少一个广告平台

I’ll be honest — every time I open my browser to check on my NAS, Proxmox cluster, or Home Assistant instance, that red “Your connection is not private” warning drives me up the wall. I know I can click “Advanced” and proceed. I know it’s “fine.” But doing it dozens of times a week? It gets old fast.

Let’s Encrypt won’t work for internal domains. Buying commercial certs for a homelab is absurd. So I’ve been hunting for a “personal CA” solution — something that can issue certificates for my LAN devices without making my browser freak out.

That’s how I stumbled upon ReactorCA, a Go-based CLI tool with 124 GitHub stars. It’s niche, it’s small, but it solves exactly this problem.

What Problem Does It Actually Solve?

ReactorCA is built for one thing: managing a small Certificate Authority for homelabs and SOHO environments. Its core philosophy is “inversion of control” — unlike traditional CAs where clients generate CSRs, ReactorCA manages all private keys centrally. One command to issue, one command to renew, one command to deploy.

The author’s motivation is timely too. Apple already limits certificate lifetimes to one year, and the industry is marching toward 47-day validity by 2029. Manual certificate management is becoming unsustainable. Automation isn’t a nice-to-have anymore — it’s mandatory.

Core Features Breakdown

1. Self-Signed CA Creation and Management

The basics: create a root CA that you trust once, and every certificate it signs becomes trusted too.

ca init          # Initialize config files, auto-detect SSH keys
ca ca create     # Generate a self-signed CA (password-protected)

Configuration lives in config/ca.yaml — validity (default 10 years), key algorithm (RSA 2048-4096, EC P256-521, ED25519), hash algorithm (SHA256/384/512), and your encryption provider of choice.

2. Host Certificate Issuance and Renewal

Issue certificates for specific hosts with full SAN support — DNS names, IP addresses, emails, URIs.

ca host issue my-nas      # Issue a cert for my-nas
ca host list              # View all certs with expiration dates
ca host issue my-nas --deploy  # Issue and deploy in one shot

Per-host configs go in config/hosts.yaml. Each host gets its own validity period, crypto settings, export paths, and deployment commands. Variable substitution includes ${cert}, ${chain}, ${key_encrypted}, and ${private_key} — handy for writing deployment scripts.

3. Multiple Private Key Encryption Options

This is where ReactorCA really shines. Private keys are encrypted with age’s ChaCha20-Poly1305, and you get three ways to unlock them:

  • Password: scrypt key derivation, works everywhere
  • SSH key: Supports Ed25519, RSA, and ECDSA — convenient if you already have SSH keys set up
  • Hardware tokens: YubiKey, Apple Secure Enclave, TPM via age plugins

I’m using password mode myself, but the YubiKey support genuinely impressed me. You don’t see hardware token integration in homelab tools very often.

4. Automated Deployment

After issuing a certificate, deploy it via shell scripts to target devices. The author includes examples for FritzBox, Proxmox PVE, and NixOS.

# config/hosts.yaml example
my-nas:
  sans:
    dns: [nas.local, nas.lan]
    ip: [192.168.1.10]
  validity: 365d
  export:
    cert: /tmp/nas.crt
    key: /tmp/nas.key
  deploy:
    - scp ${cert} ${key} root@nas:/etc/nginx/ssl/
    - ssh root@nas "systemctl restart nginx"

5. Certificate Inventory and Expiration Tracking

ca host list shows all certificates and their expiration dates. There’s no auto-renewal daemon, but at least you can see what’s about to expire at a glance.

The store layout is refreshingly clean:

store/
├── ca/ca.crt, ca.key.age
├── hosts/<id>/cert.crt, cert.key.age
└── ca.log

Real-World Use Cases

After testing it out, here are the scenarios where ReactorCA really clicks:

Unified internal certificate management: NAS, router admin panels, Proxmox, Home Assistant — all signed by one CA. Import the root cert once, green locks everywhere.

VPN internal certificates: WireGuard or Tailscale networks where internal hostnames need valid TLS. ReactorCA handles the whole fleet.

Git-driven certificate infrastructure: Everything is YAML. The store directory can live in git. Certificate changes go through PRs. Team-friendly and auditable.

Quick Start

Installation is dead simple — grab a prebuilt binary or compile from source:

go build -o ca ./cmd/ca

Then it’s a four-step dance:

ca init
ca ca create
ca host issue <host-id>
ca host deploy <host-id>

Takes under five minutes. Honestly smoother than I expected.

The Good and The Bad (And Yes, There Is Bad)

Pros:

  • Single static binary, zero runtime dependencies — classic Go
  • Age-encrypted private keys, way more secure than plaintext PEM files
  • Hardware token support — YubiKey users will love this
  • Configuration-as-code, Git-friendly
  • Flexible deployment scripts with variable substitution

Cons:

  • No intermediate CA support: You get one root CA, period. Can’t do hierarchical PKI. If your homelab is complex and you want regional or functional CA splits, tough luck.
  • No CRL or OCSP: Certificate revocation is basically manual deletion. No standard revocation mechanism. If a private key gets compromised, you just hope nobody’s using it.
  • No PKCS#12 export: Some devices (older Windows IIS, certain network gear) only accept p12 format. You’ll need to convert with openssl yourself.
  • No auto-renewal daemon: The author touts “one-button reissue,” but you still need to run commands manually or set up your own cron job. Given the “47-day validity” motivation, the lack of automatic renewal is a real gap.
  • ED25519 compatibility warning: The author themselves note it’s “not recommended for general public use in 2025.” For homelab internals it doesn’t matter, but RSA2048+SHA256 is the safe bet if you’re going broader.
  • 124 stars = tiny community: Don’t expect Stack Overflow answers. If you hit an edge case, you’re reading source code or filing an issue.

Comparison with Alternatives

ToolStrengthsBest For
ReactorCALightweight CLI, age encryption, Git-friendlyHomelab / small office, simplicity-first
Let’s EncryptFree public certs, auto-renewalPublic domains with port 80/443 access
step-caFull-featured, intermediate CAs, ACME protocolEnterprise or teams needing complete PKI
XCAGUI interface, visual managementUsers who prefer clicking over typing
certstrapMinimal, Netflix-backedQuick dev/test certificate generation
EasyRSAOpenVPN companion toolPrimarily VPN certificate setups

Let’s Encrypt is the gold standard for free certs, but it doesn’t work for internal domains. step-ca is far more capable — ACME protocol, intermediate CAs, the works — but it’s also heavier to deploy and configure. ReactorCA sits in a sweet spot: more features than certstrap, lighter than step-ca.

Who Should Use This?

ReactorCA is worth a look if you:

  • Run multiple internal services and are tired of browser security warnings
  • Want a Git-friendly certificate management workflow
  • Care about private key security and don’t want plaintext PEM files lying around
  • Own a YubiKey or similar hardware token and want to actually use it
  • Don’t want to deploy a full step-ca just for a handful of homelab certs

But if you need enterprise PKI features — intermediate CAs, auto-renewal, revocation lists, multi-tenancy — look at step-ca or commercial solutions instead.

Final Thoughts

ReactorCA is a “just right” tool. It won’t solve every certificate problem under the sun, but for homelabs and small offices, it covers the essentials well. The age encryption for private keys is a standout feature, and the Git-driven configuration approach feels natural for developers.

That said, it’s a 124-star project. Don’t expect Let’s Encrypt levels of maturity and stability. My take: perfect for personal homelabs, workable for small teams, but tread carefully in production environments.

Rating: ⭐⭐⭐⭐ (deducting one star for missing auto-renewal and CRL support)

[广告位: article-bottom] 请在 .env 中配置至少一个广告平台

Related Posts