blob: d320b5024d77175fb60e847436e3235de3c4dbe8 [file] [log] [blame]
use crate::transport::{
service::TlsAcceptor,
tls::{Certificate, Identity},
};
use std::fmt;
/// Configures TLS settings for servers.
#[derive(Clone, Default)]
pub struct ServerTlsConfig {
identity: Option<Identity>,
client_ca_root: Option<Certificate>,
client_auth_optional: bool,
}
impl fmt::Debug for ServerTlsConfig {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("ServerTlsConfig").finish()
}
}
impl ServerTlsConfig {
/// Creates a new `ServerTlsConfig`.
pub fn new() -> Self {
ServerTlsConfig {
identity: None,
client_ca_root: None,
client_auth_optional: false,
}
}
/// Sets the [`Identity`] of the server.
pub fn identity(self, identity: Identity) -> Self {
ServerTlsConfig {
identity: Some(identity),
..self
}
}
/// Sets a certificate against which to validate client TLS certificates.
pub fn client_ca_root(self, cert: Certificate) -> Self {
ServerTlsConfig {
client_ca_root: Some(cert),
..self
}
}
/// Sets whether client certificate verification is optional.
///
/// This option has effect only if CA certificate is set.
///
/// # Default
/// By default, this option is set to `false`.
pub fn client_auth_optional(self, optional: bool) -> Self {
ServerTlsConfig {
client_auth_optional: optional,
..self
}
}
pub(crate) fn tls_acceptor(&self) -> Result<TlsAcceptor, crate::Error> {
TlsAcceptor::new(
self.identity.clone().unwrap(),
self.client_ca_root.clone(),
self.client_auth_optional,
)
}
}