Skip to main content

Modern, async-native Python ACME client library for embedding TLS certificate automation.

Project description

lacme

CI PyPI Python License

Modern, async-native Python ACME client library for embedding TLS certificate automation.

What is lacme?

lacme fills the gap between full-featured CLI tools like certbot (not designed for embedding) and low-level ACME protocol libraries that leave orchestration to you. It provides a high-level Client.issue() one-liner alongside full access to every step of the ACME workflow. lacme has just two runtime dependencies -- httpx and cryptography -- and supports Python 3.11+.

Features

  • Async-native with sync wrapper -- Client for asyncio, SyncClient for blocking code
  • HTTP-01 and DNS-01 challenges -- built-in handlers with pluggable DNS providers (Cloudflare, Route 53, shell hooks)
  • Built-in Certificate Authority -- CertificateAuthority for issuing private CA certs, ideal for mTLS
  • ACME Responder -- ACMEResponder ASGI app backed by the built-in CA for internal PKI
  • Framework integrations -- first-class support for Starlette, FastAPI, and Uvicorn
  • CLI tool -- lacme issue, lacme renew, lacme revoke from the command line
  • Auto-renewal -- RenewalManager runs in the background and re-issues expiring certificates
  • Rate limit tracking -- client-side awareness of Let's Encrypt rate limits with warnings and blocking
  • Event system + Prometheus metrics -- EventDispatcher with typed events; optional MetricsCollector
  • MockACMEServer for testing -- in-process mock ACME server via httpx.MockTransport

Quick Start

pip install lacme
import asyncio
from lacme import Client
from lacme.challenges.http01 import HTTP01Handler

async def main():
    handler = HTTP01Handler()
    async with Client(
        directory_url="https://acme-v02.api.letsencrypt.org/directory",
        contact="mailto:you@example.com",
        challenge_handler=handler,
    ) as client:
        server = await handler.start_server()  # port 80
        bundle = await client.issue("example.com")
        server.close()
        await server.wait_closed()
    print(bundle.fullchain_pem.decode())

asyncio.run(main())

Private CA / mTLS

from lacme import CertificateAuthority, client_ssl_context, server_ssl_context

ca = CertificateAuthority()
ca.init()

server_cert = ca.issue("myservice.internal")
client_cert = ca.issue("worker-1", client=True)

server_ctx = server_ssl_context(
    cert_pem=server_cert.fullchain_pem,
    key_pem=server_cert.key_pem,
    ca_cert_pem=ca.root_cert_pem,  # require client certs
)
client_ctx = client_ssl_context(
    cert_pem=client_cert.cert_pem,
    key_pem=client_cert.key_pem,
    ca_cert_pem=ca.root_cert_pem,
)

CLI

# Issue a certificate via Let's Encrypt staging
lacme --staging --contact you@example.com issue example.com

# Renew all certificates expiring within 30 days
lacme renew --days 30

# Revoke a certificate
lacme revoke example.com

Documentation

Full documentation is available at turnstonelabs.github.io/lacme.

License

Apache-2.0

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lacme-1.0.1.tar.gz (196.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

lacme-1.0.1-py3-none-any.whl (70.1 kB view details)

Uploaded Python 3

File details

Details for the file lacme-1.0.1.tar.gz.

File metadata

  • Download URL: lacme-1.0.1.tar.gz
  • Upload date:
  • Size: 196.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for lacme-1.0.1.tar.gz
Algorithm Hash digest
SHA256 d90f919f7eb98e6569d05acc9e8e86006540356d9c1321cb7dd868352965201f
MD5 d2116d4250773391429df72a01e38fa7
BLAKE2b-256 853f0371df0b8c5d92697234893ec90168983d86a6608cadae01f287b9093aa9

See more details on using hashes here.

Provenance

The following attestation bundles were made for lacme-1.0.1.tar.gz:

Publisher: publish.yml on turnstonelabs/lacme

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file lacme-1.0.1-py3-none-any.whl.

File metadata

  • Download URL: lacme-1.0.1-py3-none-any.whl
  • Upload date:
  • Size: 70.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for lacme-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 3ceb598c4044378d55f91ca661d5fab1366739711ca05f8e3f8143904a04a1a9
MD5 f056ef424bb9aa985e38e09bfc4fc933
BLAKE2b-256 3ae4fe7d02c95f20c4212683456da605125a28463d3838a77cbcab4234c63015

See more details on using hashes here.

Provenance

The following attestation bundles were made for lacme-1.0.1-py3-none-any.whl:

Publisher: publish.yml on turnstonelabs/lacme

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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