CERTIFICATE LIFECYCLE MANAGEMENT

Certificates that renew and install themselves.

ViperCLM issues, tracks and renews TLS certificates from public CAs and your internal Microsoft PKI — then pushes them onto the servers that actually serve them. It runs on your own infrastructure and never needs an inbound port open.

  • DNS-01 only — nothing exposed to the internet
  • Public CAs and internal AD CS in one inventory
  • Private keys AES-256-GCM encrypted at rest
viper-clm — overview
VIPER / OVERVIEW ! 1 EXPIRING SYSTEMS NOMINAL

// CERTIFICATE COMMAND

Overview

LIVE CERTIFICATES 19 currently valid
EXPIRING ≤ 3D 0 critical window
EXPIRING ≤ 31D 1 on the horizon

Certificates per CA

  • microsoft-adcs11
  • letsencrypt7
  • zerossl1
SELF-HOSTEDYour servers, your data
ZERO INBOUNDOutbound API calls only
MULTI-CAPublic + internal PKI
SINGLE BINARYGo + Postgres, in Docker

THE PROBLEM

Expiry is a calendar problem that becomes an outage problem.

Certificate estates sprawl across public CAs, internal PKI, load balancers and Windows servers. The tracking lives in a spreadsheet, the renewal lives in somebody's head, and the install is a manual PFX import at 11pm.

01

Nobody owns the inventory

Certs are issued by whoever needed one that day, from whichever CA had budget. There is no single list, so there is no single warning.

02

Validation demands exposure

HTTP-01 wants port 80 reachable from the internet. Internal hosts and segmented networks simply can't play, so they get manual certs instead.

03

Issued ≠ installed

A renewed certificate sitting in a folder protects nothing. The last mile — onto the IIS binding, onto the NGINX vhost — is where renewals actually fail.

CAPABILITIES

One inventory, every authority, all the way to the binding.

Unified multi-CA model

Let's Encrypt, ZeroSSL, SSL.com and Google Trust Services over ACME — with External Account Binding handled where the CA requires it. Accounts are keyed per authority and environment, so staging and production never cross wires.

DNS-01 with automatic zone routing

Hostnames match to the right DNS credential by longest zone suffix, so multiple zones across IONOS and ClouDNS work side by side. Nothing needs to resolve publicly, and nothing needs to be reachable.

Internal Microsoft PKI

Enrol against your own AD CS certificate authority for internal names that no public CA will ever sign — template selection included — and keep those certificates in the same inventory as everything else.

Deploys to the actual server

IIS over WinRM: imports the PFX and repoints the site's HTTPS binding. NGINX and Apache over SSH: writes the fullchain and key, then runs your reload command. Load balancers, firewalls and Java keystores are coming down the same path. The renewal isn't done until it's live.

Shared credential vault

Service accounts and SSH keys live once under Security and are referenced by devices. One credential serves many targets, and rotating it is one edit rather than a hunt.

Live status, not a spreadsheet

Every request moves through pending → dns_challenge → issued in view, with deployment jobs tracked separately against each device. Overview charts break the estate down by authority and expiry window, so the next thirty days are never a surprise.

HOW IT WORKS

Four steps, then it keeps doing them.

  1. 1

    Connect a DNS zone

    Add your IONOS or ClouDNS credential once per zone. It's encrypted before it touches the database and can be rotated from the UI without a restart.

  2. 2

    Pick an authority

    Choose a public CA — with EAB credentials if it needs them — or point the request at your internal AD CS. Start on staging, flip to production when you're happy.

  3. 3

    Request the hostname

    ViperCLM publishes the DNS-01 TXT record, waits for propagation, completes the challenge and stores the certificate with its key encrypted at rest.

  4. 4

    Bind it to a device

    Attach the certificate to an IIS site or a Linux vhost. From then on, renewal and redeployment happen on the same path — no 11pm PFX imports.

THE CONSOLE

Requesting a certificate is one form.

Pick the authority, type the hostname. ViperCLM works out which DNS credential owns the zone, publishes the challenge and tracks it through to issued.

viper-clm — certificates

// ISSUANCE & INVENTORY

Certificates

REQUEST INVENTORY

Request a certificate

Public ACME CA — validated via DNS-01 using the DNS credential whose zone matches the hostname.

Let's Encrypt — letsencrypt
portal.example.co.uk
Request certificate

SUPPORTED

What it talks to today.

Certificate authorities

  • Let's Encrypt staging + production
  • ZeroSSL EAB
  • SSL.com EAB
  • Google Trust Services EAB
  • Microsoft AD CS internal PKI

DNS-01 providers

  • IONOS
  • ClouDNS
  • Zones route automatically by longest suffix match — mix vendors freely across one estate.

Deployment targets

  • IIS WinRM / PowerShell
  • NGINX SSH
  • Apache SSH
  • FortiGate REST / CLI beta
  • F5 BIG-IP iControl REST beta
  • Java keystore SSH / keytool beta
  • Credentials come from the shared vault, so one service account can serve an entire fleet. Beta targets are implemented and ready to trial, but not yet proven against live hardware.

SECURITY POSTURE

Built for networks that don't get to trust the internet.

ViperCLM was designed for segmented estates and internal PKI first. The threat model is written down, and the defaults follow it.

Ask us anything
  • Encrypted before it lands

    DNS and CA secrets and every issued private key are AES-256-GCM encrypted with your master key before reaching Postgres, and decrypted in memory only at the moment of use.

  • A database leak isn't an app breach

    The master key and the admin credential are deploy-time environment variables, never editable through the UI. Stolen Postgres data alone yields neither access nor a working decryption key.

  • Outbound only

    Nothing needs to be reachable from the internet. The app needs egress to your CA and DNS APIs — put the admin UI behind your own VPN or reverse proxy as your boundary dictates.

  • Encrypted management traffic

    WinRM sessions are Kerberos-sealed at the message layer, so certificate material crosses the wire encrypted without loosening a single setting on the target host.

SELF-HOST

Up in three commands.

One Go binary and a Postgres database, both in Docker Compose. No frontend build, no external services, no agent to install on the hosts you're issuing for.

  • Generate a master key and an admin password hash
  • docker compose up -d
  • Add a DNS credential and request your first certificate
bash
# secrets it needs
$ openssl rand -base64 32
$ docker compose run --rm app hash-password

# bring it up
$ docker compose up -d

# verify what you were issued
$ openssl x509 -in cert.pem -noout -issuer
issuer=C=US, O=Let's Encrypt, CN=R11

GET IN TOUCH

Tell us about your estate.

Whether it's a handful of public certificates or a few hundred spread across internal PKI and Windows servers, we'll tell you straight whether ViperCLM fits — and what it would take to run it.

  • Questions about internal AD CS or an unusual CA
  • A deployment target we don't support yet
  • Self-hosting, sizing and security review

Prefer email? jamie.campbell@viper-clm.co.uk

We'll only use this to reply. No newsletter, no sharing it on.