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

Produces output/certpost-server and output/certpost.

Cross-compile for Linux:

make build-linux-amd64
make build-linux-arm64

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

Uploaded Python 3Windows ARM64

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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3manylinux: glibc 2.17+ x86-64

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

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

File metadata

  • Download URL: certpost-1.0.0b8-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.0b8-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 a6ecb34a696f2840563b28197d7cb637917a54dbfef354c0b08a85379dfcb9a7
MD5 6e1b052f05360994d197805ae60bef5a
BLAKE2b-256 02bc67bcb800e3e9ce126014d5fa72006de8b205f594a73011e79dafbcb8b197

See more details on using hashes here.

File details

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

File metadata

  • Download URL: certpost-1.0.0b8-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.0b8-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 9028f2aeef75755759a602539187cedf4a9a4d5e3fe12968ba9d82008dc69962
MD5 abf21932424ec43c4ab3b85bdc444949
BLAKE2b-256 28f058e806a7089618e5aeaff36492be2c35261393d4455aa9e52e080bf131b0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for certpost-1.0.0b8-py3-none-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 db66fef5ee2e0074bfc9d02eaa3bffbc4c8af738da551f90c469dfff96efc1e1
MD5 d8bb4116ad43ef7684e835deb3f003a7
BLAKE2b-256 66ce0884f4a4c8566924e66fc4b04b94efab565b236eb26afe0509888977322e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for certpost-1.0.0b8-py3-none-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 b54d3212a721b79b0fe054d128f5a78475c802460db54bcb75fb7392a670d16e
MD5 b3ea1b131d724e5c53cc40c40c0a31db
BLAKE2b-256 31ff74d9ba23882455c46e5493e143806180394273a7221a185a6c6fccea5285

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for certpost-1.0.0b8-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a43b784a426d9e271bcc484fe2f0f8e74a0a9a952078e68add9a3e85f74235c6
MD5 2cc2d089b36d335fe6ab4bfa025097d5
BLAKE2b-256 0238b7e5d5ba5b951cb9ddd739b10d8cddc1d1405959aadfc8b15ab66d826094

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for certpost-1.0.0b8-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 2cf736de27c13c972f5a46f8f69d1b78b30bd79fcd9c8cdec68f54ab3500651b
MD5 f3315388dd3ee0cc08e1927d5cddc5d8
BLAKE2b-256 3660bfe8601cfbf8870acd13a8ab1d7419d6c5754c0ab20c8bbc9c68dbb4858e

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