certmagic 0.2.0

Automatic TLS certificate acquisition, renewal, and maintenance for Rust servers
Documentation
[package]
name = "certmagic"
version = "0.2.0"
edition = "2024"
license = "Apache-2.0"
repository = "https://github.com/houseme/certmagic"
homepage = "https://github.com/houseme/certmagic"
documentation = "https://docs.rs/certmagic"
description = "Automatic TLS certificate acquisition, renewal, and maintenance for Rust servers"
keywords = ["tls", "acme", "letsencrypt", "https", "certificate"]
categories = ["network-programming", "cryptography", "asynchronous"]
exclude = ["docs/", ".github/"]

# Include every optional backend in the published API documentation.
[package.metadata.docs.rs]
all-features = true
targets = ["x86_64-unknown-linux-gnu"]

[dependencies]
# async runtime
tokio = { version = "1.53.2", features = ["rt-multi-thread", "macros", "net", "time", "sync", "fs", "io-util", "signal"] }
tokio-util = { version = "0.7.20", features = ["rt"] }
futures = "0.3.34"

# TLS
rustls = { version = "0.23.45", default-features = false, features = ["std", "tls12"] }
tokio-rustls = { version = "0.26.6", default-features = false, features = ["tls12"] }
rustls-pki-types = "1.15.1"

# X.509 / keys
rcgen = { version = "0.14.10", default-features = false, features = ["crypto", "pem"] }
x509-parser = "0.18.1"
ring = { version = "0.17.14", optional = true }
aws-lc-rs = { version = "1.18.1", optional = true }
p521 = { version = "0.14.0", features = ["ecdsa"] }
rsa = { version = "0.10.0-rc.19", optional = true, features = ["sha2", "getrandom"] }

# HTTP
reqwest = { version = "0.13.5", default-features = false, features = ["form", "http2", "json"] }

# serialization / errors / logging
serde = { version = "1.0.229", features = ["derive"] }
serde_json = "1.0.152"
thiserror = "2.0.21"
tracing = "0.1.44"
async-trait = "0.1.92"

# utilities
base64 = "0.23.1"
rand = "0.10.3"
sha1 = "0.11.0"
sha2 = "0.11.0"
hex = "0.4.3"
time = { version = "0.3.55", features = ["formatting", "parsing", "serde", "std"] }
idna = "1.1.0"
url = "2.5.8"
hickory-resolver = { version = "0.26.3", optional = true }
redis = { version = "1.7.1", optional = true, default-features = false, features = ["tokio-rustls-comp", "tls-rustls-webpki-roots", "connection-manager"] }

etcd-client = { version = "0.21.0", optional = true, default-features = false, features = ["tls-webpki-roots"] }

aws-sdk-s3 = { version = "1.152.0", optional = true, default-features = false, features = ["rt-tokio"] }
aws-sdk-secretsmanager = { version = "1.120.0", optional = true, default-features = false, features = ["rt-tokio"] }
aws-smithy-http-client = { version = "1.5.0", optional = true, default-features = false, features = ["rt-tokio"] }

[dev-dependencies]
tempfile = "3.27.0"
tokio = { version = "1.53.2", features = ["test-util"] }

[features]
# Production-oriented default: AWS-LC-RS is the rustls/reqwest/rcgen
# provider, with ZeroSSL support. RSA key generation is opt-in.
# The `ring` feature below remains
# available for portable builds (use it with `--no-default-features`).
default = [
    "aws-lc-rs",
    "zerossl",
    "file-storage",
    "http-01",
    "dns-01",
    "ocsp",
]
# Select the rustls/reqwest/rcgen and ACME crypto provider. Only the selected
# backend is enabled; `ring` remains available for portable builds.
ring = [
    "dep:ring",
    "aws-smithy-http-client?/rustls-ring",
    "etcd-client?/tls-ring",
    "rustls/ring",
    "tokio-rustls/ring",
    "rcgen/ring",
    "reqwest/rustls-no-provider",
    "x509-parser/verify",
]
aws-lc-rs = [
    "dep:aws-lc-rs",
    "aws-smithy-http-client?/rustls-aws-lc",
    "etcd-client?/tls-aws-lc",
    "rustls/aws_lc_rs",
    "tokio-rustls/aws_lc_rs",
    "rcgen/aws_lc_rs",
    "reqwest/rustls",
    "x509-parser/verify-aws",
]
# RSA key generation uses RustCrypto's RSA implementation and rcgen's
# selected signing backend for CSR generation. It is intentionally opt-in:
# RustSec RUSTSEC-2023-0071 has no upstream fixed release yet.
rsa = ["dep:rsa", "aws-lc-rs", "rcgen/aws_lc_rs"]
file-storage = []
redis-storage = ["dep:redis"]
etcd-storage = ["dep:etcd-client"]
remote-cert-store = []
s3-cert-store = ["remote-cert-store", "dep:aws-sdk-s3", "dep:aws-smithy-http-client"]
vault-cert-store = ["remote-cert-store"]
secrets-manager-cert-store = ["remote-cert-store", "dep:aws-sdk-secretsmanager", "dep:aws-smithy-http-client"]
http-01 = []
dns-01 = ["dep:hickory-resolver"]
ocsp = []
zerossl = []
local-cache = []
integration-tests = []

[profile.dev]
opt-level = 0
debug = 1

[profile.release]
lto = "thin"
codegen-units = 1
strip = "debuginfo"

[lints.rust]
unsafe_code = "forbid"
missing_debug_implementations = "warn"

[lints.clippy]
all = "warn"
dbg_macro = "warn"

[[bench]]
name = "cache_paths"
harness = false
required-features = ["local-cache"]

[[example]]
name = "redis_storage"
required-features = ["redis-storage"]

[[example]]
name = "etcd_storage"
required-features = ["etcd-storage"]

[[example]]
name = "s3_cert_store"
required-features = ["s3-cert-store", "etcd-storage"]

[[example]]
name = "vault_cert_store"
required-features = ["vault-cert-store", "etcd-storage"]

[[example]]
name = "secrets_manager_cert_store"
required-features = ["secrets-manager-cert-store", "etcd-storage"]

[[bench]]
name = "remote_cert_store"
harness = false
required-features = ["remote-cert-store"]