1- use std:: fs:: File ;
21use tokio:: net:: TcpStream ;
32
43#[ cfg( feature = "use-native-tls" ) ]
54use {
6- std:: io:: Read , tokio_native_tls:: native_tls,
5+ std:: fs :: File , std :: io:: Read , tokio_native_tls:: native_tls,
76 tokio_native_tls:: native_tls:: Error as NativeTlsError ,
87} ;
98
@@ -12,9 +11,11 @@ use crate::TlsConfig;
1211use tokio_rustls:: rustls:: { server:: WebPkiClientVerifier , RootCertStore } ;
1312#[ cfg( feature = "use-rustls" ) ]
1413use {
15- rustls_pemfile:: Item ,
16- std:: { io:: BufReader , sync:: Arc } ,
17- tokio_rustls:: rustls:: { pki_types:: PrivateKeyDer , Error as RustlsError , ServerConfig } ,
14+ std:: sync:: Arc ,
15+ tokio_rustls:: rustls:: {
16+ pki_types:: { pem:: PemObject , CertificateDer , PrivateKeyDer } ,
17+ Error as RustlsError , ServerConfig ,
18+ } ,
1819 tracing:: error,
1920} ;
2021
@@ -57,6 +58,9 @@ pub enum Error {
5758 MissingTenantId ,
5859 #[ error( "Tenant id missing in certificate" ) ]
5960 CertificateParse ,
61+ #[ cfg( feature = "use-rustls" ) ]
62+ #[ error( "PEM parsing error: {0}" ) ]
63+ Pem ( #[ from] tokio_rustls:: rustls:: pki_types:: pem:: Error ) ,
6064}
6165
6266#[ cfg( feature = "verify-client-cert" ) ]
@@ -198,14 +202,15 @@ impl TLSAcceptor {
198202
199203 let ( certs, key) = {
200204 // Get certificates
201- let cert_file = File :: open ( cert_path) ;
202- let cert_file = cert_file. map_err ( |_| Error :: ServerCertNotFound ( cert_path. clone ( ) ) ) ?;
203- let certs = rustls_pemfile:: certs ( & mut BufReader :: new ( cert_file) )
204- . collect :: < Result < Vec < _ > , _ > > ( )
205- . map_err ( |_| Error :: InvalidServerCert ( cert_path. to_string ( ) ) ) ?;
205+ let cert_pem = std:: fs:: read ( cert_path)
206+ . map_err ( |_| Error :: ServerCertNotFound ( cert_path. clone ( ) ) ) ?;
207+ let certs: Vec < CertificateDer > =
208+ CertificateDer :: pem_slice_iter ( & cert_pem) . collect :: < Result < Vec < _ > , _ > > ( ) ?;
206209
207210 // Get private key
208- let key = first_private_key_in_pemfile ( key_path) ?;
211+ let key_pem =
212+ std:: fs:: read ( key_path) . map_err ( |_| Error :: ServerKeyNotFound ( key_path. clone ( ) ) ) ?;
213+ let key = PrivateKeyDer :: from_pem_slice ( & key_pem) ?;
209214
210215 ( certs, key)
211216 } ;
@@ -215,12 +220,15 @@ impl TLSAcceptor {
215220 // client authentication with a CA. CA isn't required otherwise
216221 #[ cfg( feature = "verify-client-cert" ) ]
217222 let builder = {
218- let ca_file = File :: open ( ca_path) ;
219- let ca_file = ca_file. map_err ( |_| Error :: CaFileNotFound ( ca_path. clone ( ) ) ) ?;
220- let ca_file = & mut BufReader :: new ( ca_file) ;
221- let ca_cert = rustls_pemfile:: certs ( ca_file)
223+ let ca_pem =
224+ std:: fs:: read ( ca_path) . map_err ( |_| Error :: CaFileNotFound ( ca_path. clone ( ) ) ) ?;
225+ let ca_certs: Vec < CertificateDer > =
226+ CertificateDer :: pem_slice_iter ( & ca_pem) . collect :: < Result < Vec < _ > , _ > > ( ) ?;
227+
228+ let ca_cert = ca_certs
229+ . into_iter ( )
222230 . next ( )
223- . ok_or_else ( || Error :: InvalidCACert ( ca_path. to_string ( ) ) ) ?? ;
231+ . ok_or_else ( || Error :: InvalidCACert ( ca_path. to_string ( ) ) ) ?;
224232
225233 let mut store = RootCertStore :: empty ( ) ;
226234 store
@@ -245,38 +253,3 @@ impl TLSAcceptor {
245253 Ok ( TLSAcceptor :: Rustls { acceptor } )
246254 }
247255}
248-
249- #[ cfg( feature = "use-rustls" ) ]
250- /// Get the first private key in a PEM file
251- fn first_private_key_in_pemfile ( key_path : & String ) -> Result < PrivateKeyDer < ' static > , Error > {
252- // Get private key
253- let key_file = File :: open ( key_path) ;
254- let key_file = key_file. map_err ( |_| Error :: ServerKeyNotFound ( key_path. clone ( ) ) ) ?;
255-
256- let rd = & mut BufReader :: new ( key_file) ;
257-
258- // keep reading Items one by one to find a Key, return error if none found.
259- loop {
260- let item = rustls_pemfile:: read_one ( rd) . map_err ( |err| {
261- error ! ( "Error reading key file: {:?}" , err) ;
262- Error :: InvalidServerKey ( key_path. clone ( ) )
263- } ) ?;
264-
265- match item {
266- Some ( Item :: Sec1Key ( key) ) => {
267- return Ok ( key. into ( ) ) ;
268- }
269- Some ( Item :: Pkcs1Key ( key) ) => {
270- return Ok ( key. into ( ) ) ;
271- }
272- Some ( Item :: Pkcs8Key ( key) ) => {
273- return Ok ( key. into ( ) ) ;
274- }
275- None => {
276- error ! ( "No private key found in {:?}" , key_path) ;
277- return Err ( Error :: InvalidServerKey ( key_path. clone ( ) ) ) ;
278- }
279- _ => { }
280- }
281- }
282- }
0 commit comments