AcmeX is a modular, enterprise-grade ACME v2 (RFC 8555) client and server ecosystem written in Rust. It is designed for high performance, reliability, and extensibility, supporting various DNS providers, storage backends, and cryptographic libraries. AcmeX enables automated certificate lifecycle management with advanced features like OCSP verification, multi-provider DNS-01 challenges, and a RESTful management API.
AcmeX follows a layered design to ensure separation of concerns and ease of maintenance:
HTTP-01, DNS-01, and TLS-ALPN-01 challenges.zeroize for sensitive data, and RFC 7807 error reporting.Add AcmeX to your Cargo.toml:
[dependencies]
acmex = "0.8.0"
Enable optional features as needed:
[dependencies.acmex]
version = "0.8.0"
features = ["dns-cloudflare", "redis", "cli"]
Available features:
aws-lc-rs (default), ring-cryptoredisdns-cloudflare, dns-route53, dns-alibaba, dns-azure, dns-google, dns-huawei,
dns-tencent, etc.google-ca, zerossl-cametrics, cliuse acmex::prelude::*;
#[tokio::main]
async fn main() -> Result<()> {
// 1. Configure the client
let config = AcmeConfig::lets_encrypt_staging()
.with_contact(Contact::email("admin@example.com"))
.with_tos_agreed(true);
let mut client = AcmeClient::new(config)?;
// 2. Set up challenge solvers
let mut solver_registry = ChallengeSolverRegistry::new();
// For DNS-01 challenge with Cloudflare (enable dns-cloudflare feature)
// solver_registry.register(Box::new(CloudflareSolver::new(api_token, zone_id)?));
// For HTTP-01 challenge
// solver_registry.register(Box::new(Http01Solver::new()));
// 3. Issue a certificate
let domains = vec!["example.com".to_string(), "www.example.com".to_string()];
let bundle = client.issue_certificate(domains, &mut solver_registry).await?;
// 4. Save the certificate
bundle.save_to_files("cert.pem", "key.pem")?;
Ok(())
}
# Build and run the server
cargo run --features cli -- --config acmex.toml
Example acmex.toml:
[server]
host = "0.0.0.0"
port = 8080
api_key = "your-secret-api-key"
[storage]
backend = "file"
path = "./data"
[acme]
directory_url = "https://acme-v02.api.letsencrypt.org/directory"
contact_email = "admin@example.com"
cargo build
cargo test
Explore the examples/ directory for more usage patterns:
Detailed documentation is available in the docs directory:
API documentation: docs.rs/acmex
We welcome contributions! Please see our Contributing Guide for details on how to get started.
Licensed under either of:
at your option.