@@ -401,7 +401,10 @@ impl ConnectionInfo {
401401 . then ( || {
402402 // do not apply validation if using a self-signed certificate,as the documentation suggests
403403 let config = if !validation {
404- & ConnectionTLSConfig :: NoSSLValidation
404+ match tls_config {
405+ ConnectionTLSConfig :: MutualTLS ( _) => tls_config,
406+ _ => & ConnectionTLSConfig :: NoSSLValidation ,
407+ }
405408 } else {
406409 tls_config
407410 } ;
@@ -477,6 +480,31 @@ impl ConnectionInfo {
477480 . dangerous ( )
478481 . with_custom_certificate_verifier ( Arc :: new ( NoCertificateVerification ) )
479482 . with_no_client_auth ( ) ,
483+ ConnectionTLSConfig :: MutualTLS ( mutual) => {
484+ let cert_file = File :: open ( & mutual. client_cert ) ?;
485+ let mut cert_reader = BufReader :: new ( cert_file) ;
486+ let cert_certs = rustls_pemfile:: certs ( & mut cert_reader) . flatten ( ) ;
487+
488+ let cert_key = File :: open ( & mutual. client_key ) ?;
489+ let mut key_reader = BufReader :: new ( cert_key) ;
490+ let keys = rustls_pemfile:: private_key ( & mut key_reader) ;
491+ let keys = keys?. unwrap ( ) ;
492+ if mutual. cert_file . is_some ( ) {
493+ let root_cert_file = File :: open ( mutual. cert_file . as_ref ( ) . unwrap ( ) ) ?;
494+ let mut root_reader = BufReader :: new ( root_cert_file) ;
495+ let root_certs = rustls_pemfile:: certs ( & mut root_reader) . flatten ( ) ;
496+ root_cert_store. add_parsable_certificates ( root_certs) ;
497+ builder
498+ . with_root_certificates ( root_cert_store)
499+ . with_client_auth_cert ( cert_certs. collect ( ) , keys)
500+ . map_err ( |_e| Error :: ConnectionError ) ?
501+ } else {
502+ builder
503+ . with_root_certificates ( RootCertStore :: empty ( ) )
504+ . with_client_auth_cert ( cert_certs. collect ( ) , keys)
505+ . map_err ( |_e| Error :: ConnectionError ) ?
506+ }
507+ }
480508 } ;
481509
482510 let config = Arc :: new ( config) ;
0 commit comments