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

Uploaded Python 3Windows ARM64

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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3manylinux: glibc 2.17+ x86-64

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

certpost-1.1.0-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.1.0-py3-none-win_arm64.whl.

File metadata

  • Download URL: certpost-1.1.0-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.6

File hashes

Hashes for certpost-1.1.0-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 6895bd15a64bdaee005fa05434b26336eb3dbf18c72f886257be2cf4e00960bf
MD5 bbc71409e88ca92ea1a2f30f6238b80b
BLAKE2b-256 7295e0c657ce72c12177c66386c0fa445f1d3e29e2eba5dc36b7a30aa4dd6b04

See more details on using hashes here.

File details

Details for the file certpost-1.1.0-py3-none-win_amd64.whl.

File metadata

  • Download URL: certpost-1.1.0-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.6

File hashes

Hashes for certpost-1.1.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 8297fc3fc8c24b61c2f11a1c76f70bd5909c8fcfeef2edb3af5a54c23b0b27b1
MD5 8c64cb4c6d60021643f0c0ef3b096283
BLAKE2b-256 64bb876433eed97c66b8a1fa89f1e3d3d7846e56ae7117381c7f1113c486bf30

See more details on using hashes here.

File details

Details for the file certpost-1.1.0-py3-none-manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for certpost-1.1.0-py3-none-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 9f867bc998cadae235830b3155a8fd7f8cbae9a0ada9071d441e3899b33f6c4c
MD5 06a4b44818fe1893b447c6abe19bbb0d
BLAKE2b-256 2ca8dbd961566a567ffaacc35c229ff435620f7c49fff76204405e65ea8f5801

See more details on using hashes here.

File details

Details for the file certpost-1.1.0-py3-none-manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for certpost-1.1.0-py3-none-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 0ce61ccca7efce5460ee551bd84b57d89dbf6edb7e99bb463fdfa338a0c11106
MD5 d981f450d7086d665f5a6a81b4b396c5
BLAKE2b-256 6788eec6bca2c3bb321db8fe10db9ccd52113f9e6099fee3ef37a18d68f03ce9

See more details on using hashes here.

File details

Details for the file certpost-1.1.0-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for certpost-1.1.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 616ca67e1952d7a84fdafc439caf495de22994ffff41d406b5431211d916af4f
MD5 5dcf1c4e3f3f96f4305d252d90d5ae56
BLAKE2b-256 902bde98a4bf4a0d957d4b408b99c27f58bc3b2d22c8c0bc19a15ccf4927e2b5

See more details on using hashes here.

File details

Details for the file certpost-1.1.0-py3-none-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for certpost-1.1.0-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 05ee5c43292407c9b747f0c1c5d9c98f62ed18e544c053c6c20a470b26e86f51
MD5 49acb3988f633bf91e67ab562dbdf492
BLAKE2b-256 bd777db6942c453bd35137ec5fc4c2286042e45c2397dd45385e92e28765568a

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