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.0b14-py3-none-win_arm64.whl (5.2 MB view details)

Uploaded Python 3Windows ARM64

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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3manylinux: glibc 2.17+ x86-64

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

certpost-1.0.0b14-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.0b14-py3-none-win_arm64.whl.

File metadata

  • Download URL: certpost-1.0.0b14-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.0b14-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 c4e33156f3287ffb178f294a208d3147e5bd502ec9ede8ccef2bbb513ff02a92
MD5 d4466e187ee2a7dff85a8ca2fcbfc7b6
BLAKE2b-256 84243c4eb1602dd8892f7071295f938e43c9bf960a3a6b3429800f08d133c17d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: certpost-1.0.0b14-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.0b14-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 1ed86ae4417da456081537ba7ba1e321b1cfa5392c6cb501ad772eb897063de7
MD5 83bfd5f4848724a0a2a1cdfa9fce5aab
BLAKE2b-256 6b05970051a5c57c59689e26efc9b1efbc0b86ddf1e7d6bae91d9f885c6f0f49

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for certpost-1.0.0b14-py3-none-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 b0943e682132f9233635b79c60050b63f7f1794fbca3a551ca22061af306b79e
MD5 dba375c1bef2b0a3e902bf88b9b6afc6
BLAKE2b-256 9b37f437378d8eb920d3bce3ee35062a10d6a73ee211cc9c59a9687ef7161d5f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for certpost-1.0.0b14-py3-none-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 3c2a40ee3359a7e52f32a75427fa6933ad650f763baeac9f6f7c5c4ab4faa14e
MD5 c84667d2e3968b554f7d2ba7e866c7ca
BLAKE2b-256 1089b20b46f0905b76dcac2f977f76a6b5719d090a67dae0fd0399c5452e1f79

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for certpost-1.0.0b14-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 017ebf5170ad149b3a9b0c817b44fa86c72104a8e2e3b1b6e458bb3a39d599da
MD5 db15db0d524c68fb26e169303688efbd
BLAKE2b-256 8a2d80a38f2a6803be065a2af4d8696585783aebfab63a2986aff00d98b4322e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for certpost-1.0.0b14-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c26819868ad7fa68e1b5a35ab86b92e3151fad51f0434dc10bb35254f7b6cf2c
MD5 3ba249d33b4f3b886239458eff564f83
BLAKE2b-256 bd3e4ea5b6aadf605ff1d11726aab679d156b3e72a3d0988f3b3860b1a07b205

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