Skip to content

Commit d75b20a

Browse files
authored
Fix MutualTLS issue (#256)
1 parent 41ce66f commit d75b20a

File tree

2 files changed

+29
-5
lines changed

2 files changed

+29
-5
lines changed

lib/src/auth/mod.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ impl ClientCertificate {
2323

2424
#[derive(Debug, Clone, PartialEq)]
2525
pub struct MutualTLS {
26+
pub(crate) validation: bool,
2627
pub(crate) cert_file: Option<PathBuf>,
2728
pub(crate) client_cert: PathBuf,
2829
pub(crate) client_key: PathBuf,
@@ -35,9 +36,16 @@ impl MutualTLS {
3536
client_key: impl AsRef<Path>,
3637
) -> Self {
3738
MutualTLS {
39+
validation: true,
3840
cert_file: cert_file.map(|p| p.as_ref().to_path_buf()),
3941
client_cert: client_cert.as_ref().to_path_buf(),
4042
client_key: client_key.as_ref().to_path_buf(),
4143
}
4244
}
45+
pub fn with_no_validation(&self) -> Self {
46+
Self {
47+
validation: false,
48+
..self.clone()
49+
}
50+
}
4351
}

lib/src/connection.rs

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -402,13 +402,15 @@ impl ConnectionInfo {
402402
// do not apply validation if using a self-signed certificate,as the documentation suggests
403403
let config = if !validation {
404404
match tls_config {
405-
ConnectionTLSConfig::MutualTLS(_) => tls_config,
406-
_ => &ConnectionTLSConfig::NoSSLValidation,
405+
ConnectionTLSConfig::MutualTLS(mtls) => {
406+
ConnectionTLSConfig::MutualTLS(mtls.with_no_validation())
407+
}
408+
_ => ConnectionTLSConfig::NoSSLValidation,
407409
}
408410
} else {
409-
tls_config
411+
tls_config.clone()
410412
};
411-
Self::tls_connector(url.host(), config)
413+
Self::tls_connector(url.host(), &config)
412414
})
413415
.transpose()?;
414416

@@ -498,9 +500,23 @@ impl ConnectionInfo {
498500
.with_root_certificates(root_cert_store)
499501
.with_client_auth_cert(cert_certs.collect(), keys)
500502
.map_err(|_e| Error::ConnectionError)?
503+
} else if mutual.validation {
504+
match rustls_native_certs::load_native_certs() {
505+
Ok(certs) => {
506+
root_cert_store.add_parsable_certificates(certs);
507+
}
508+
Err(e) => {
509+
warn!("Failed to load native certificates: {e}");
510+
}
511+
}
512+
builder
513+
.with_root_certificates(root_cert_store)
514+
.with_client_auth_cert(cert_certs.collect(), keys)
515+
.map_err(|_e| Error::ConnectionError)?
501516
} else {
502517
builder
503-
.with_root_certificates(RootCertStore::empty())
518+
.dangerous()
519+
.with_custom_certificate_verifier(Arc::new(NoCertificateVerification))
504520
.with_client_auth_cert(cert_certs.collect(), keys)
505521
.map_err(|_e| Error::ConnectionError)?
506522
}

0 commit comments

Comments
 (0)