Skip to content

Commit d2d7e50

Browse files
authored
RUST-1122 Fix x509 auth for pkcs8 keys and Atlas free tier (#532) (#536)
1 parent 3e28f31 commit d2d7e50

File tree

3 files changed

+22
-12
lines changed

3 files changed

+22
-12
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ md-5 = "0.9.1"
4646
os_info = { version = "3.0.1", default-features = false }
4747
percent-encoding = "2.0.0"
4848
rand = { version = "0.7.2", features = ["small_rng"] }
49+
rustls-pemfile = "0.2.1"
4950
serde_with = "1.3.1"
5051
sha-1 = "0.9.4"
5152
sha2 = "0.9.3"

src/client/auth/x509.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,16 +51,20 @@ 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 => {
5757
send_client_first(conn, credential, server_api)
5858
.await?
5959
.raw_response
6060
}
6161
};
6262

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

src/client/options/mod.rs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use rustls::{
2222
ServerCertVerifier,
2323
TLSError,
2424
};
25+
use rustls_pemfile::{read_one, Item};
2526
use serde::{
2627
de::{Error, Unexpected},
2728
Deserialize,
@@ -615,19 +616,23 @@ impl TlsOptions {
615616
};
616617

617618
file.seek(SeekFrom::Start(0))?;
618-
let key = match pemfile::rsa_private_keys(&mut file) {
619-
Ok(key) => key,
620-
Err(()) => {
621-
return Err(ErrorKind::ParseError {
622-
data_type: "PEM-encoded RSA key".to_string(),
623-
file_path: path,
619+
let key = loop {
620+
match read_one(&mut file) {
621+
Ok(Some(Item::PKCS8Key(bytes))) | Ok(Some(Item::RSAKey(bytes))) => {
622+
break rustls::PrivateKey(bytes)
623+
}
624+
Ok(Some(_)) => continue,
625+
Ok(None) | Err(_) => {
626+
return Err(ErrorKind::ParseError {
627+
data_type: "PEM-encoded keys".to_string(),
628+
file_path: path,
629+
}
630+
.into())
624631
}
625-
.into())
626632
}
627633
};
628634

629-
// TODO: Get rid of unwrap.
630-
config.set_single_client_cert(certs, key.into_iter().next().unwrap())?;
635+
config.set_single_client_cert(certs, key)?;
631636
}
632637

633638
Ok(config)

0 commit comments

Comments
 (0)