pub mod acme;
pub mod acme_dns01;
pub mod dns;
pub mod mtls;
use std::path::Path;
use std::sync::Arc;
use tokio_rustls::rustls::server::danger::ClientCertVerifier;
use tokio_rustls::rustls::server::ResolvesServerCert;
use waf_proxy::tls::{FileCertSource, TlsCertSource, TlsError, TlsMaterial};
pub use acme::{AcmeError, AcmeParams, ChallengeStrategy};
pub use mtls::{verifier_from_ca_file, MtlsError};
pub struct ManagedTlsCertSource {
resolver: Option<Arc<dyn ResolvesServerCert>>,
verifier: Option<Arc<dyn ClientCertVerifier>>,
file_fallback: Option<FileCertSource>,
}
impl ManagedTlsCertSource {
pub fn builder() -> ManagedTlsBuilder {
ManagedTlsBuilder::default()
}
}
impl TlsCertSource for ManagedTlsCertSource {
fn load(&self) -> Result<TlsMaterial, TlsError> {
match &self.file_fallback {
Some(fs) => fs.load(),
None => Err(TlsError::NoCertificates(Path::new(
"<managed TLS: a server cert requires either ACME ([tls.acme]) or a file cert>",
)
.to_path_buf())),
}
}
fn resolver(&self) -> Option<Arc<dyn ResolvesServerCert>> {
self.resolver.clone()
}
fn client_verifier(&self) -> Option<Arc<dyn ClientCertVerifier>> {
self.verifier.clone()
}
}
#[derive(Default)]
pub struct ManagedTlsBuilder {
resolver: Option<Arc<dyn ResolvesServerCert>>,
verifier: Option<Arc<dyn ClientCertVerifier>>,
file_fallback: Option<FileCertSource>,
}
impl ManagedTlsBuilder {
pub fn resolver(mut self, resolver: Arc<dyn ResolvesServerCert>) -> Self {
self.resolver = Some(resolver);
self
}
pub fn client_verifier(mut self, verifier: Arc<dyn ClientCertVerifier>) -> Self {
self.verifier = Some(verifier);
self
}
pub fn file_fallback(mut self, source: FileCertSource) -> Self {
self.file_fallback = Some(source);
self
}
pub fn build(self) -> ManagedTlsCertSource {
ManagedTlsCertSource {
resolver: self.resolver,
verifier: self.verifier,
file_fallback: self.file_fallback,
}
}
}