use acme2_eab::gen_rsa_private_key;
use acme2_eab::AccountBuilder;
use acme2_eab::AuthorizationStatus;
use acme2_eab::ChallengeStatus;
use acme2_eab::Csr;
use acme2_eab::DirectoryBuilder;
use acme2_eab::Error;
use acme2_eab::OrderBuilder;
use acme2_eab::OrderStatus;
use std::time::Duration;
const LETS_ENCRYPT_URL: &str = "https://acme-v02.api.letsencrypt.org/directory";
#[tokio::main]
async fn main() -> Result<(), Error> {
let dir = DirectoryBuilder::new(LETS_ENCRYPT_URL.to_string())
.build()
.await?;
let mut builder = AccountBuilder::new(dir.clone());
builder.contact(vec!["mailto:hello@lcas.dev".to_string()]);
builder.terms_of_service_agreed(true);
let account = builder.build().await?;
let mut builder = OrderBuilder::new(account);
builder.add_dns_identifier("example.com".to_string());
let order = builder.build().await?;
let authorizations = order.authorizations().await?;
for auth in authorizations {
let challenge = auth.get_challenge("http-01").unwrap();
let challenge = challenge.validate().await?;
let challenge = challenge.wait_done(Duration::from_secs(5), 3).await?;
assert_eq!(challenge.status, ChallengeStatus::Valid);
let authorization = auth.wait_done(Duration::from_secs(5), 3).await?;
assert_eq!(authorization.status, AuthorizationStatus::Valid)
}
let order = order.wait_ready(Duration::from_secs(5), 3).await?;
assert_eq!(order.status, OrderStatus::Ready);
let pkey = gen_rsa_private_key(4096)?;
let order = order.finalize(Csr::Automatic(pkey)).await?;
let order = order.wait_done(Duration::from_secs(5), 3).await?;
assert_eq!(order.status, OrderStatus::Valid);
let cert = order.certificate().await?.unwrap();
assert!(cert.len() > 1);
Ok(())
}