Skip to content

Commit 4538343

Browse files
committed
RUST-1122 Fix x509 auth for pkcs8 keys and Atlas free tier (#532)
1 parent bf0275e commit 4538343

File tree

3 files changed

+30
-14
lines changed

3 files changed

+30
-14
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ md-5 = "0.9.1"
6363
os_info = { version = "3.0.1", default-features = false }
6464
percent-encoding = "2.0.0"
6565
rand = { version = "0.8.3", features = ["small_rng"] }
66+
rustls-pemfile = "0.2.1"
6667
serde_with = "1.3.1"
6768
sha-1 = "0.9.4"
6869
sha2 = "0.9.3"

src/client/auth/x509.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,18 @@ pub(super) async fn authenticate_stream(
5151
server_api: Option<&ServerApi>,
5252
server_first: impl Into<Option<Document>>,
5353
) -> Result<()> {
54-
let server_response = match server_first.into() {
55-
Some(server_first) => server_first,
54+
let server_response: Document = match server_first.into() {
55+
Some(_) => return Ok(()),
5656
None => send_client_first(conn, credential, server_api)
5757
.await?
5858
.auth_response_body("MONGODB-X509")?,
5959
};
6060

61-
if server_response.get_str("dbname") != Ok("$external") {
61+
if server_response
62+
.get("ok")
63+
.and_then(crate::bson_util::get_int)
64+
!= Some(1)
65+
{
6266
return Err(Error::authentication_error(
6367
"MONGODB-X509",
6468
"Authentication failed",

src/client/options/mod.rs

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ use rustls::{
2626
ServerCertVerifier,
2727
TLSError,
2828
};
29+
use rustls_pemfile::{read_one, Item};
2930
use serde::{
3031
de::{Error, Unexpected},
3132
Deserialize,
@@ -846,22 +847,32 @@ impl TlsOptions {
846847
};
847848

848849
file.seek(SeekFrom::Start(0))?;
849-
let key = match pemfile::rsa_private_keys(&mut file) {
850-
Ok(key) => key,
851-
Err(()) => {
852-
return Err(ErrorKind::InvalidTlsConfig {
853-
message: format!(
854-
"Unable to parse PEM-encoded RSA key from {}",
855-
path.display()
856-
),
850+
let key = loop {
851+
match read_one(&mut file) {
852+
Ok(Some(Item::PKCS8Key(bytes))) | Ok(Some(Item::RSAKey(bytes))) => {
853+
break rustls::PrivateKey(bytes)
854+
}
855+
Ok(Some(_)) => continue,
856+
Ok(None) => {
857+
return Err(ErrorKind::InvalidTlsConfig {
858+
message: format!("No PEM-encoded keys in {}", path.display()),
859+
}
860+
.into())
861+
}
862+
Err(_) => {
863+
return Err(ErrorKind::InvalidTlsConfig {
864+
message: format!(
865+
"Unable to parse PEM-encoded item from {}",
866+
path.display()
867+
),
868+
}
869+
.into())
857870
}
858-
.into())
859871
}
860872
};
861873

862-
// TODO: Get rid of unwrap.
863874
config
864-
.set_single_client_cert(certs, key.into_iter().next().unwrap())
875+
.set_single_client_cert(certs, key)
865876
.map_err(|e| ErrorKind::InvalidTlsConfig {
866877
message: e.to_string(),
867878
})?;

0 commit comments

Comments
 (0)