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

Uploaded Python 3Windows ARM64

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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3manylinux: glibc 2.17+ x86-64

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

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

File metadata

  • Download URL: certpost-1.0.0b9-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.0b9-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 0db7eecd15ee8b2d586b87f225400661513af4541c6bd6a1ea7e02adecfcd246
MD5 14837a5f928df4c2e539337737fcd66e
BLAKE2b-256 a880a18e21c28be99d2abaac3e1c1ac284c8ad5bd1eca74ea5a3840338bc88ff

See more details on using hashes here.

File details

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

File metadata

  • Download URL: certpost-1.0.0b9-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.0b9-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 6ae9de0cc093f8a31d897ca3d56331000238551d8e2479db8186240ece6d936c
MD5 7e14a439aa951cf9b0d5416389386143
BLAKE2b-256 050dcae9be3ff519cae558a3f77a3122cb2a35750dd036aa513eb8132b1fbde7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for certpost-1.0.0b9-py3-none-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 b66153b80cee2bda751ed353408b8d886e3bcfe8f8ed2b6a1fc1907aa95bc671
MD5 b408034df981df8f3e50b3aa234b42f8
BLAKE2b-256 ac3184ae9b4841a9bd5719b2eb08f86ea975cb8e063a61326b9f6ceb45f8c9ae

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for certpost-1.0.0b9-py3-none-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 acdca257fd25eaf9c54383e67fabc54f9c7da71b8cb84eb379227ab708cd2d0f
MD5 2555b1ff0675c086f68541e58bea156b
BLAKE2b-256 8dafe486934fe5a56c22cfc05ada4b4def189038fe4547c3ab702e8121b23688

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for certpost-1.0.0b9-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a2e8a55d4d9ae9cfb9647babbb4c46d7e57a2e61f989d6d23c976b07f02d1150
MD5 d6be1d92fa6087154519f3023c897c0e
BLAKE2b-256 5a833ead9132aa91ebfa19d3e9e52a22e2732944f7d16ab778d516dcbe0f271a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for certpost-1.0.0b9-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f01daa3d734d4bf2185dfd194fdb0d4f3e75b24054557c967a0f03d630741cc9
MD5 63840bf6221c95e82becc3d2b66c73eb
BLAKE2b-256 9f5897684a59493ecb80ff5897159a2b2de9a87799fe8e6f33a1fb90245da37a

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