pico acme
The tiniest python package to get ACMEv2 certs from Let's Encrypt.
Supports only single domains and DNS challenge. Currently implements AWS Route 53 but you can trivially implement your own provider.
Licensed under Apache 2.0 as this reuses some code from certbot.
quick start
Install from PyPI:
pip install pico-acme
(Note that you need to install boto3 separately to use route53.)
new.py:
ROUTE53_HOSTED_ZONE_ID = "..."
ACCOUNT_EMAIL = "domains@example.com"
DOMAIN = "example.com"
# create account, get cert, and save details
import pico_acme
from pico_acme import route53
# register an acme account
acme_client = pico_acme.register_account(ACCOUNT_EMAIL, agree_tos=True)
# create a private key and certificate signing request
key_pem = pico_acme.make_key()
csr_pem = pico_acme.make_csr(key_pem, [DOMAIN])
# get functions for upserting and cleaning up DNS records in AWS Route 53
upsert, clean = route53.route53_upsert_cleanup(ROUTE53_HOSTED_ZONE_ID)
# perform DNS-01 challenge to get the full chain as PEM
fullchain_pem = pico_acme.perform_dns01(acme_client, DOMAIN, csr_pem, upsert, clean)
# save account for later
with open("pico_acme_account.json", "w") as f:
f.write(pico_acme.serialize_account(acme_client))
# save private key for later
with open("key.pem", "wb") as f:
f.write(key_pem)
# save the cert for later
with open("fullchain.pem", "w") as f:
f.write(fullchain_pem)
renew.py:
ROUTE53_HOSTED_ZONE_ID = "..."
DOMAIN = "example.com"
# later, load account, private key, and renew cert
import pico_acme
from pico_acme import route53
# load account
with open("pico_acme_account.json") as f:
acme_client = pico_acme.deserialize_account(f.read())
# load private key
with open("key.pem", "rb") as f:
key_pem = f.read()
# make a new certificate signing request
csr_pem = pico_acme.make_csr(key_pem, [DOMAIN])
# get functions for upserting and cleaning up DNS records in AWS Route 53
upsert, clean = route53.route53_upsert_cleanup(ROUTE53_HOSTED_ZONE_ID)
# perform DNS-01 challenge to get the full chain as PEM
fullchain_pem = pico_acme.perform_dns01(acme_client, DOMAIN, csr_pem, upsert, clean)
# save the cert for later
with open("fullchain.pem", "w") as f:
f.write(fullchain_pem)
checking if you need to renew
import pico_acme
with open("fullchain.pem") as f:
fullchain_pem = f.read()
if pico_acme.should_renew(fullchain_pem):
print("due for renewal")
architecture & features
The perform_dns01 takes two callables, upsert(record, value) which should set the value value (the verification string) in record record (e.g. _acme-challenge.example.com), and clean(record, value) which should clean these up. See the route53.py implementation for details.
acknowledgements
This is based very heavily on certbot, with portions copied directly.
Metadata
Release files for pico_acme 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| pico_acme-0.1.0.tar.gz | 7.0 kB | Without provenance | Details for pico_acme-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| pico_acme-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for pico_acme-0.1.0-py3-none-any.whl |
Total release size: 12.6 kB
Release files / pico_acme-0.1.0.tar.gz
| Download URL | pico_acme-0.1.0.tar.gz |
|---|---|
| Size | 7.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
60c30abc0cc1717f816dd2c306453e75ca132082021eeb9e446bb9ff26eb3da1
|
|
BLAKE2b-256 checksum How to use checksums |
2e09dee205cb6374bb5698dde000bed7d0f2e7de8ae14462f303e50d1f45cc3a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.10.2 {"installer":{"name":"uv","version":"0.10.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / pico_acme-0.1.0-py3-none-any.whl
| Download URL | pico_acme-0.1.0-py3-none-any.whl |
|---|---|
| Size | 5.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
dc4ba002da4b9680b41c482119aee02f33f234de633be570618a22813d67df9a
|
|
BLAKE2b-256 checksum How to use checksums |
e05def81ec1357d6c202158a45dc046ba924eadbb3c05c7bbf0a8b553ac1224e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.10.2 {"installer":{"name":"uv","version":"0.10.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for pico_acme 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.