@@ -3,7 +3,7 @@ use anyhow::{anyhow, Result};
3
3
use rustls:: { server:: WebPkiClientVerifier , RootCertStore , ServerConfig } ;
4
4
use rustls_pemfile:: Item ;
5
5
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 } ;
7
7
8
8
// This is required by certificate hot reload when using inotify, which is available only on linux
9
9
#[ cfg( target_os = "linux" ) ]
@@ -43,7 +43,7 @@ pub(crate) async fn create_tls_config_and_watch_certificate_changes(
43
43
Some ( load_client_ca_certs ( tls_config. client_ca_file . clone ( ) ) . await ?)
44
44
} ;
45
45
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 ( ) ) ?;
47
47
48
48
let rust_config = RustlsConfig :: from_config ( Arc :: new ( initial_config) ) ;
49
49
let reloadable_rust_config = rust_config. clone ( ) ;
@@ -122,8 +122,7 @@ pub(crate) async fn create_tls_config_and_watch_certificate_changes(
122
122
. unwrap ( ) ,
123
123
) ;
124
124
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 ( ) ) ;
127
126
if let Err ( e) = server_config {
128
127
error ! ( "Failed to reload TLS certificate: {e}" ) ;
129
128
continue ;
@@ -144,8 +143,7 @@ pub(crate) async fn create_tls_config_and_watch_certificate_changes(
144
143
. unwrap ( ) ;
145
144
146
145
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 ( ) ) ;
149
147
if let Err ( e) = server_config {
150
148
error ! ( "Failed to reload TLS certificate: {e}" ) ;
151
149
continue ;
@@ -161,7 +159,7 @@ pub(crate) async fn create_tls_config_and_watch_certificate_changes(
161
159
}
162
160
163
161
// Build the TLS server
164
- async fn build_tls_server_config (
162
+ fn build_tls_server_config (
165
163
cert : Vec < CertificateDer < ' static > > ,
166
164
key : PrivateKeyDer < ' static > ,
167
165
client_verifier : Option < Arc < dyn rustls:: server:: danger:: ClientCertVerifier > > ,
@@ -182,7 +180,12 @@ async fn load_server_cert_and_key(
182
180
cert_file : & Path ,
183
181
key_file : & Path ,
184
182
) -> 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
+
186
189
let cert: Vec < CertificateDer > = rustls_pemfile:: certs ( cert_reader)
187
190
. filter_map ( |it| {
188
191
if let Err ( ref e) = it {
@@ -196,8 +199,7 @@ async fn load_server_cert_and_key(
196
199
return Err ( anyhow ! ( "Multiple certificates provided in cert file" ) ) ;
197
200
}
198
201
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)
201
203
. filter_map ( |i| match i. ok ( ) ? {
202
204
Item :: Sec1Key ( key) => Some ( key. secret_sec1_der ( ) . to_vec ( ) ) ,
203
205
Item :: Pkcs1Key ( key) => Some ( key. secret_pkcs1_der ( ) . to_vec ( ) ) ,
@@ -226,7 +228,8 @@ async fn load_client_ca_certs(
226
228
) -> Result < Arc < dyn rustls:: server:: danger:: ClientCertVerifier > > {
227
229
let mut store = RootCertStore :: empty ( ) ;
228
230
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[ ..] ) ;
230
233
231
234
let client_ca_certs: Vec < _ > = rustls_pemfile:: certs ( client_ca_reader)
232
235
. filter_map ( |it| {
0 commit comments