Skip to content

Commit ef86e56

Browse files
fix: use non-blocking fs functions to load files
Signed-off-by: Fabrizio Sestito <fabrizio.sestito@suse.com>
1 parent 3f37990 commit ef86e56

File tree

1 file changed

+14
-11
lines changed

1 file changed

+14
-11
lines changed

src/certs.rs

+14-11
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use anyhow::{anyhow, Result};
33
use rustls::{server::WebPkiClientVerifier, RootCertStore, ServerConfig};
44
use rustls_pemfile::Item;
55
use rustls_pki_types::{CertificateDer, PrivateKeyDer};
6-
use std::{fs::File, io::BufReader, path::Path, sync::Arc};
6+
use std::{io::BufReader, path::Path, sync::Arc};
77

88
// This is required by certificate hot reload when using inotify, which is available only on linux
99
#[cfg(target_os = "linux")]
@@ -43,7 +43,7 @@ pub(crate) async fn create_tls_config_and_watch_certificate_changes(
4343
Some(load_client_ca_certs(tls_config.client_ca_file.clone()).await?)
4444
};
4545
let initial_config =
46-
build_tls_server_config(cert.clone(), key.clone_key(), client_verifier.clone()).await?;
46+
build_tls_server_config(cert.clone(), key.clone_key(), client_verifier.clone())?;
4747

4848
let rust_config = RustlsConfig::from_config(Arc::new(initial_config));
4949
let reloadable_rust_config = rust_config.clone();
@@ -122,8 +122,7 @@ pub(crate) async fn create_tls_config_and_watch_certificate_changes(
122122
.unwrap(),
123123
);
124124
let server_config =
125-
build_tls_server_config(cert.clone(), key.clone_key(), client_verifier.clone())
126-
.await;
125+
build_tls_server_config(cert.clone(), key.clone_key(), client_verifier.clone());
127126
if let Err(e) = server_config {
128127
error!("Failed to reload TLS certificate: {e}");
129128
continue;
@@ -144,8 +143,7 @@ pub(crate) async fn create_tls_config_and_watch_certificate_changes(
144143
.unwrap();
145144

146145
let server_config =
147-
build_tls_server_config(cert.clone(), key.clone_key(), client_verifier.clone())
148-
.await;
146+
build_tls_server_config(cert.clone(), key.clone_key(), client_verifier.clone());
149147
if let Err(e) = server_config {
150148
error!("Failed to reload TLS certificate: {e}");
151149
continue;
@@ -161,7 +159,7 @@ pub(crate) async fn create_tls_config_and_watch_certificate_changes(
161159
}
162160

163161
// Build the TLS server
164-
async fn build_tls_server_config(
162+
fn build_tls_server_config(
165163
cert: Vec<CertificateDer<'static>>,
166164
key: PrivateKeyDer<'static>,
167165
client_verifier: Option<Arc<dyn rustls::server::danger::ClientCertVerifier>>,
@@ -182,7 +180,12 @@ async fn load_server_cert_and_key(
182180
cert_file: &Path,
183181
key_file: &Path,
184182
) -> Result<(Vec<CertificateDer<'static>>, PrivateKeyDer<'static>)> {
185-
let cert_reader = &mut BufReader::new(File::open(cert_file)?);
183+
let cert_contents = tokio::fs::read(cert_file).await?;
184+
let key_contents = tokio::fs::read(key_file).await?;
185+
186+
let cert_reader = &mut BufReader::new(&cert_contents[..]);
187+
let key_reader = &mut BufReader::new(&key_contents[..]);
188+
186189
let cert: Vec<CertificateDer> = rustls_pemfile::certs(cert_reader)
187190
.filter_map(|it| {
188191
if let Err(ref e) = it {
@@ -196,8 +199,7 @@ async fn load_server_cert_and_key(
196199
return Err(anyhow!("Multiple certificates provided in cert file"));
197200
}
198201

199-
let key_file_reader = &mut BufReader::new(File::open(key_file)?);
200-
let mut key_vec: Vec<Vec<u8>> = rustls_pemfile::read_all(key_file_reader)
202+
let mut key_vec: Vec<Vec<u8>> = rustls_pemfile::read_all(key_reader)
201203
.filter_map(|i| match i.ok()? {
202204
Item::Sec1Key(key) => Some(key.secret_sec1_der().to_vec()),
203205
Item::Pkcs1Key(key) => Some(key.secret_pkcs1_der().to_vec()),
@@ -226,7 +228,8 @@ async fn load_client_ca_certs(
226228
) -> Result<Arc<dyn rustls::server::danger::ClientCertVerifier>> {
227229
let mut store = RootCertStore::empty();
228230
for client_ca_file in client_cas {
229-
let client_ca_reader = &mut BufReader::new(File::open(client_ca_file)?);
231+
let client_ca_contents = tokio::fs::read(&client_ca_file).await?;
232+
let client_ca_reader = &mut BufReader::new(&client_ca_contents[..]);
230233

231234
let client_ca_certs: Vec<_> = rustls_pemfile::certs(client_ca_reader)
232235
.filter_map(|it| {

0 commit comments

Comments
 (0)