kutil_http/tls/
acme.rs

1use super::{container::*, error::*};
2
3use {
4    bytestring::*,
5    rustls_acme::{caches::*, *},
6    std::{io, path::*},
7};
8
9// https://docs.rs/instant-acme/latest/instant_acme/
10// https://docs.rs/rustls-acme/latest/rustls_acme/
11// cli only? https://github.com/breard-r/acmed
12
13pub use acme::{LETS_ENCRYPT_PRODUCTION_DIRECTORY, LETS_ENCRYPT_STAGING_DIRECTORY};
14
15impl TlsContainer {
16    /// Add [ResolvesServerCertAcme] for all hosts.
17    pub fn add_resolver_from_acme(&mut self, acme: ACME) -> Result<(), TlsContainerError> {
18        let hosts = acme.hosts.clone();
19        let state = acme.into_config().state();
20        let resolver = state.resolver();
21        for host in hosts {
22            self.add_delegate(host.clone(), resolver.clone())?;
23        }
24        Ok(())
25    }
26}
27
28//
29// ACME
30//
31
32/// ACME.
33#[derive(Debug, Default)]
34pub struct ACME {
35    /// Hosts.
36    pub hosts: Vec<ByteString>,
37
38    /// Directory URL.
39    pub directory: ByteString,
40
41    /// Contacts (usually email addresses).
42    pub contacts: Vec<ByteString>,
43
44    /// Cache path.
45    pub cache: PathBuf,
46}
47
48impl ACME {
49    /// Into [AcmeConfig].
50    pub fn into_config(self) -> AcmeConfig<io::Error> {
51        let mut acme_config = AcmeConfig::new(self.hosts).directory(self.directory).cache(DirCache::new(self.cache));
52        for contact in self.contacts {
53            acme_config = acme_config.contact_push(String::from("mailto:") + &contact);
54        }
55        acme_config
56    }
57}