use std::sync::Arc;
use certon::{
AcmeIssuer, CertResolver, Config, FileStorage, KeyType, LETS_ENCRYPT_STAGING, OcspConfig,
Result, Storage,
};
#[tokio::main]
async fn main() -> Result<()> {
tracing_subscriber::fmt::init();
let storage: Arc<dyn Storage> = Arc::new(FileStorage::new("/tmp/certon-example"));
let le_staging = AcmeIssuer::builder()
.ca(LETS_ENCRYPT_STAGING)
.email("admin@example.com")
.agreed(true)
.storage(storage.clone())
.cert_key_type(KeyType::EcdsaP256)
.build();
let issuers: Vec<Arc<dyn certon::acme_issuer::CertIssuer>> = vec![Arc::new(le_staging)];
let ocsp = OcspConfig {
disable_stapling: false,
replace_revoked: true,
responder_overrides: Default::default(),
};
let on_event: Arc<dyn Fn(&str, &serde_json::Value) -> Result<()> + Send + Sync> =
Arc::new(|event_name, data| {
println!("[event] {}: {}", event_name, data);
Ok(())
});
let config = Config::builder()
.storage(storage)
.issuers(issuers)
.key_type(KeyType::EcdsaP256)
.ocsp(ocsp)
.renewal_window_ratio(1.0 / 3.0) .on_event(on_event)
.interactive(false) .build();
let domains = vec!["example.com".into(), "www.example.com".into()];
config.manage_sync(&domains).await?;
let resolver = CertResolver::new(config.cache.clone());
let _tls_config = rustls::ServerConfig::builder()
.with_no_client_auth()
.with_cert_resolver(Arc::new(resolver));
println!("TLS config ready with custom settings");
println!(" Key type: {:?}", config.key_type);
println!(" Renewal ratio: {}", config.renewal_window_ratio);
println!(" Issuers: {}", config.issuers.len());
let _maintenance_handle = certon::start_maintenance(&config);
tokio::signal::ctrl_c().await.ok();
config.cache.stop();
Ok(())
}