1use anyhow::Result;
6use rustls::ServerConfig;
7use rustls_pki_types::{CertificateDer, PrivateKeyDer};
8use std::fs;
9use std::io::BufReader;
10use tokio_rustls::TlsAcceptor;
11
12pub struct TlsConfigurer;
14
15impl TlsConfigurer {
16 pub fn create_tls_config(cert_path: &str, key_path: &str) -> Result<ServerConfig> {
18 let cert_file = fs::File::open(cert_path)?;
19 let key_file = fs::File::open(key_path)?;
20
21 let mut cert_reader = BufReader::new(cert_file);
22 let mut key_reader = BufReader::new(key_file);
23
24 let cert_chain: Vec<CertificateDer> =
25 rustls_pemfile::certs(&mut cert_reader).collect::<Result<Vec<_>, _>>()?;
26
27 let private_key: PrivateKeyDer = rustls_pemfile::private_key(&mut key_reader)?
28 .ok_or_else(|| anyhow::anyhow!("No private key found"))?;
29
30 let config = ServerConfig::builder()
31 .with_no_client_auth()
32 .with_single_cert(cert_chain, private_key)?;
33
34 Ok(config)
35 }
36
37 pub fn create_tokio_tls_config(cert_path: &str, key_path: &str) -> Result<TlsAcceptor> {
39 let config = Self::create_tls_config(cert_path, key_path)?;
40 Ok(TlsAcceptor::from(std::sync::Arc::new(config)))
41 }
42
43 pub fn install_crypto_provider() {
45 let _ = rustls::crypto::aws_lc_rs::default_provider().install_default();
46 }
47}