@@ -34,7 +34,7 @@ use crate::{
3434} ;
3535use arc_swap:: ArcSwap ;
3636use rustls:: ServerConfig ;
37- use rustls_pemfile :: Item ;
37+ use rustls_pki_types :: pem :: PemObject ;
3838use rustls_pki_types:: { CertificateDer , PrivateKeyDer } ;
3939use std:: time:: Duration ;
4040use std:: { fmt, io, net:: SocketAddr , path:: Path , sync:: Arc } ;
@@ -295,32 +295,17 @@ fn config_from_der(cert: Vec<Vec<u8>>, key: Vec<u8>) -> io::Result<ServerConfig>
295295}
296296
297297fn config_from_pem ( cert : Vec < u8 > , key : Vec < u8 > ) -> io:: Result < ServerConfig > {
298- let cert = rustls_pemfile :: certs ( & mut cert. as_ref ( ) )
299- . map ( |it| it . map ( |it| it . to_vec ( ) ) )
300- . collect :: < Result < Vec < _ > , _ > > ( ) ?;
298+ let cert: Vec < CertificateDer > = CertificateDer :: pem_slice_iter ( & cert)
299+ . collect :: < Result < Vec < _ > , _ > > ( )
300+ . map_err ( |_| io_other ( "failed to parse certificate" ) ) ?;
301301
302- let mut key_result = Err ( io_other ( "The private key file contained no keys" ) ) ;
302+ let mut key_result: Result < PrivateKeyDer , io:: Error > =
303+ Err ( io_other ( "The private key file contained no keys" ) ) ;
303304
304305 // Check the entire PEM file for the key in case it is not first section
305- for item in rustls_pemfile:: read_all ( & mut key. as_ref ( ) ) {
306- let key = item. and_then ( |i| match i {
307- Item :: Sec1Key ( key) => Ok ( key. secret_sec1_der ( ) . to_vec ( ) ) ,
308- Item :: Pkcs1Key ( key) => Ok ( key. secret_pkcs1_der ( ) . to_vec ( ) ) ,
309- Item :: Pkcs8Key ( key) => Ok ( key. secret_pkcs8_der ( ) . to_vec ( ) ) ,
310- Item :: X509Certificate ( _) => {
311- Err ( io_other ( "Unsupported private key format 'X509Certificate'" ) )
312- }
313- Item :: Crl ( _) => Err ( io_other (
314- "Unsupported private key format 'CertificateRevocationList'" ,
315- ) ) ,
316- Item :: Csr ( _) => Err ( io_other (
317- "Unsupported private key format 'CertificateSigningRequest'" ,
318- ) ) ,
319- Item :: SubjectPublicKeyInfo ( _) => Err ( io_other (
320- "Unsupported private key format 'SubjectPublicKeyInfo'" ,
321- ) ) ,
322- _ => Err ( io_other ( "Unrecognized private key format" ) ) ,
323- } ) ;
306+ for item in rustls_pki_types:: pem:: PemObject :: pem_slice_iter ( & key) {
307+ let key: Result < PrivateKeyDer , io:: Error > =
308+ item. map_err ( |_| io_other ( "failed to parse PEM" ) ) ;
324309
325310 match key_result {
326311 // if we already got a key, then...
@@ -339,7 +324,11 @@ fn config_from_pem(cert: Vec<u8>, key: Vec<u8>) -> io::Result<ServerConfig> {
339324 }
340325 }
341326
342- config_from_der ( cert, key_result?)
327+ let key = key_result?;
328+ let cert_der: Vec < Vec < u8 > > = cert. into_iter ( ) . map ( |c| c. to_vec ( ) ) . collect ( ) ;
329+ let key_der = key. secret_der ( ) . to_vec ( ) ;
330+
331+ config_from_der ( cert_der, key_der)
343332}
344333
345334async fn config_from_pem_file (
@@ -357,20 +346,12 @@ async fn config_from_pem_chain_file(
357346 chain : impl AsRef < Path > ,
358347) -> io:: Result < ServerConfig > {
359348 let cert = fs_err:: tokio:: read ( cert. as_ref ( ) ) . await ?;
360- let cert = rustls_pemfile :: certs ( & mut cert. as_ref ( ) )
361- . map ( |it| it . map ( |it| CertificateDer :: from ( it . to_vec ( ) ) ) )
362- . collect :: < Result < Vec < _ > , _ > > ( ) ?;
349+ let cert = CertificateDer :: pem_slice_iter ( & cert)
350+ . collect :: < Result < Vec < _ > , _ > > ( )
351+ . map_err ( |_| io_other ( "failed to parse certificate" ) ) ?;
363352 let key = fs_err:: tokio:: read ( chain. as_ref ( ) ) . await ?;
364- let key_cert: PrivateKeyDer = match rustls_pemfile:: read_one ( & mut key. as_ref ( ) ) ?
365- . ok_or_else ( || io_other ( "could not parse pem file" ) ) ?
366- {
367- Item :: Pkcs8Key ( key) => Ok ( key. into ( ) ) ,
368- Item :: Sec1Key ( key) => Ok ( key. into ( ) ) ,
369- Item :: Pkcs1Key ( key) => Ok ( key. into ( ) ) ,
370- x => Err ( io_other ( format ! (
371- "invalid certificate format, received: {x:?}"
372- ) ) ) ,
373- } ?;
353+ let key_cert: PrivateKeyDer =
354+ PrivateKeyDer :: from_pem_slice ( & key) . map_err ( |_| io_other ( "could not parse pem file" ) ) ?;
374355
375356 ServerConfig :: builder ( )
376357 . with_no_client_auth ( )
0 commit comments