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

Uploaded Python 3Windows ARM64

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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3manylinux: glibc 2.17+ x86-64

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

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

File metadata

  • Download URL: certpost-1.0.0b12-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.0b12-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 3ba885251bf7f6fa13559ec1931a1f1c0661699d6d58da745cec93b1d015b580
MD5 b447e6d747fb2b3c3d2e391d965bc026
BLAKE2b-256 946de5349e2a20b6b7fe7b27198ae5f4ddab006d6cbc79f6efb2318327d6eafb

See more details on using hashes here.

File details

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

File metadata

  • Download URL: certpost-1.0.0b12-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.0b12-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 d4c46eebee0c4f6225a2578b95d746dc902faa6ffcc748fd3a607191d49210fd
MD5 da433e0728c7d0e426429494361e1fde
BLAKE2b-256 94c93e954d7d62ef5b00ba5e7e3c67d726f0ce93eb94b3c050c259219988d196

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for certpost-1.0.0b12-py3-none-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 332590ccdb28b82fb87a7f7e65525009be61cc3e8dbcfcd80ed7df8dd624231c
MD5 f1bc8295c745feee8e6a63307a4f2568
BLAKE2b-256 311b6cd55b02041955bea29004d52899ed3dcf927d96185161cfed4804159cb8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for certpost-1.0.0b12-py3-none-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 7c102df3d0363b799af3a50c5c2647ea3fa7b7f4e3265dfb9b8c0226ee564f2c
MD5 1abed811940d67ed7f3b5233bc0b19aa
BLAKE2b-256 713492c27c076675f57933d20e7b201e3663c6a755a69b7ed68456bec6dad299

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for certpost-1.0.0b12-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c96b8e2f478e43ae5b33cbeb098b32361881be5b7c93c14a5bfd2fbf4269ec52
MD5 a2a04a03885f66f89fcee611960d3976
BLAKE2b-256 7d266e98e1274d52da41d0c6af9d27a1dcb5bc3dfb9e8b1274de4bf8af96e4b7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for certpost-1.0.0b12-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 37b54c6260905b967244a15c5652bf853e48a5fc663a89242574be7cbc9eb49c
MD5 d0fd3188d23eaa53c15f21d4975bc0af
BLAKE2b-256 e5d832a5ee0ad9cce4bb0005d09132bc0e03cb09f76422203220d0343827e457

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