Skip to main content

Let's Encrypt certificate manager with DNS-01 challenges, web admin panel, and TLS termination proxy

Project description

certpost

Let's Encrypt certificate manager with DNS-01 challenges, web admin panel, and TLS termination proxy. Written in Go — single static binary, no dependencies. Supports Cloudflare and Technitium DNS Server.

Features

  • Automatic certificate issuance — Let's Encrypt via ACME v2, DNS-01 challenges
  • Multiple DNS providers — Cloudflare and Technitium DNS Server, with split provider support (e.g. Cloudflare for ACME, Technitium for records)
  • Web admin panel — manage domains, view status, download certs, view logs (protected by admin key login)
  • DNS management — automatically creates and manages A/CNAME records for your subdomains
  • Background renewal — proactively renews the 2 oldest certs daily, with a 30-day expiry safety net
  • Per-domain API tokens — each domain gets its own bearer token for certificate retrieval
  • TLS termination proxy — built-in proxy with SNI routing and automatic cert refresh
  • Certificate fetching — download .crt and .key files via CLI or admin panel
  • Interactive setupcertpost-server setup and certpost init wizards for easy configuration
  • Single static binary — no runtime dependencies, no openssl required
  • Modular DNS — protocol-based design makes it easy to add new providers

Requirements

  • Go 1.22+ (for building)
  • A supported DNS provider: Cloudflare (API token + zone ID) or Technitium DNS Server (server URL + API token)

Building

make build

Cross-compiles for all platforms and builds wheels. See make help for all targets.

Server

Initial setup

certpost-server setup -d /path/to/data

This walks you through creating a config.json with your DNS provider settings, base domain, and port. An admin key is generated automatically.

Starting the server

certpost-server run -d /path/to/data

The admin panel is available at http://localhost:8443. Log in with the admin key (printed on startup). From the panel you can:

  • Add subdomains — enter an IP address or CNAME target, creates the DNS record via the configured provider, and issues a Let's Encrypt certificate
  • View certificate status and expiry dates
  • Copy or rotate per-domain API tokens
  • Download certificate files
  • View server logs

Configuration

The config.json in your data directory. Use a single dns key when one provider handles everything:

{
  "base_domain": "example.com",
  "admin_key": "auto-generated-admin-key",
  "bind": "0.0.0.0",
  "port": 8443,
  "dns": {
    "provider": "cloudflare",
    "api_token": "your-cloudflare-api-token",
    "zone_id": "your-zone-id"
  }
}

For split configurations, use dns_acme and dns_records:

{
  "base_domain": "example.com",
  "admin_key": "auto-generated-admin-key",
  "bind": "0.0.0.0",
  "port": 8443,
  "dns_acme": {
    "provider": "cloudflare",
    "api_token": "your-cloudflare-api-token",
    "zone_id": "your-zone-id"
  },
  "dns_records": {
    "provider": "technitium",
    "server_url": "https://dns.example.com",
    "api_token": "your-technitium-api-token",
    "zone": "example.com"
  }
}

Client

Fetch certificates

certpost fetch -s http://certpost:8443 -t <token> -d app.example.com -o /etc/ssl/certs

With automatic refresh every 24 hours:

certpost fetch -s http://certpost:8443 -t <token> -d app.example.com --refresh 24

TLS termination proxy

certpost proxy -c proxy.json

Generate a config interactively

certpost init

Security

  • Admin panel is protected by an admin key with cookie-based auth
  • Certificate API uses per-domain bearer tokens (not shared)
  • Private keys are stored in JSON files — protect the data directory with filesystem permissions
  • TLS proxy loads certs directly into memory via tls.X509KeyPair — no temp files

Licence

Released under the Unlicense — public domain.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

certpost-1.0.0b13-py3-none-win_arm64.whl (5.2 MB view details)

Uploaded Python 3Windows ARM64

certpost-1.0.0b13-py3-none-win_amd64.whl (5.8 MB view details)

Uploaded Python 3Windows x86-64

certpost-1.0.0b13-py3-none-manylinux_2_17_x86_64.whl (5.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

certpost-1.0.0b13-py3-none-manylinux_2_17_aarch64.whl (5.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

certpost-1.0.0b13-py3-none-macosx_11_0_arm64.whl (5.3 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

certpost-1.0.0b13-py3-none-macosx_10_9_x86_64.whl (5.8 MB view details)

Uploaded Python 3macOS 10.9+ x86-64

File details

Details for the file certpost-1.0.0b13-py3-none-win_arm64.whl.

File metadata

  • Download URL: certpost-1.0.0b13-py3-none-win_arm64.whl
  • Upload date:
  • Size: 5.2 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for certpost-1.0.0b13-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 3ad616f71f721f78ef446e8f0f17482088e1f7d2f33489c2e30989335fbd0b7e
MD5 93e07902ce6a0c2ec3f458f3290be0d2
BLAKE2b-256 0b9c2c8b321a676519f67ca2bd817831c03dc10bbdc270c193ea6e2bed426375

See more details on using hashes here.

File details

Details for the file certpost-1.0.0b13-py3-none-win_amd64.whl.

File metadata

  • Download URL: certpost-1.0.0b13-py3-none-win_amd64.whl
  • Upload date:
  • Size: 5.8 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for certpost-1.0.0b13-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 71cc4718ee55a3f8d96ad0ad95b360e0884996794595c4d221705d66fa5bb762
MD5 8964938781fd0f4eb05ed0870149fdce
BLAKE2b-256 f4cba9bd53a9be84a060151dbdf3986191c31728623209872f639523efe283f5

See more details on using hashes here.

File details

Details for the file certpost-1.0.0b13-py3-none-manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for certpost-1.0.0b13-py3-none-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 80df2d9760773c9b0e274b5ff8c471167fd8e5bcc25e1db18a177158c438d73c
MD5 29804a8ad60cbab0e8bd25af698e070f
BLAKE2b-256 18e2d5a7fed7c0cb5eca54cace3f1d9a8dee7bf62f8691563639b02f2bc5dce9

See more details on using hashes here.

File details

Details for the file certpost-1.0.0b13-py3-none-manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for certpost-1.0.0b13-py3-none-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 a82d67c320ad3beac28823cca350ebbb2e78b861a9426b1e56782dbed63b74df
MD5 6d537b45f8a6825a1d0ceda7a19c9881
BLAKE2b-256 647e30ba07b00ad58b7cdc9f51761b70c5e858badf0fcbdce075ae30118ec2dd

See more details on using hashes here.

File details

Details for the file certpost-1.0.0b13-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for certpost-1.0.0b13-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f199763a4e581b47ff34515cc6ab1a28e840d17d2b5610742053bb5ac0da4edf
MD5 4357f64ce926b38a1783c6885ffe3ef0
BLAKE2b-256 c1cbb2d031908de98900ce4e74fa5639c9ba0cf5afd72bad9ea8a3efb1067c67

See more details on using hashes here.

File details

Details for the file certpost-1.0.0b13-py3-none-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for certpost-1.0.0b13-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d908610d3833ccf217f566be747f12c34875fb769970cf8ec76a6840b2e1b3a9
MD5 ade9613c5e27b563f5ef3521356e8d86
BLAKE2b-256 3395c1e7271e105f0b05dfb11241b22433aff374f9e5e765b17f402e917464ba

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page