From 764cfd69732d94dbd2c936d4d21965dc794ed025 Mon Sep 17 00:00:00 2001 From: Kacy Fortner Date: Thu, 12 Feb 2026 11:09:32 -0500 Subject: [PATCH] harden: replace unmaintained rustls-pemfile, enable overflow checks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - replace rustls-pemfile (RUSTSEC-2025-0134) with rustls-pki-types PemObject trait — pem parsing now happens in constant time for private key data - enable overflow-checks = true in release profile so integer overflows panic instead of silently wrapping - update all dependencies to latest compatible versions - cargo audit now reports zero advisories --- Cargo.lock | 272 ++++++++++++++++++++++++++------- Cargo.toml | 5 +- crates/ember-cli/Cargo.toml | 2 +- crates/ember-cli/src/tls.rs | 5 +- crates/ember-server/Cargo.toml | 2 +- crates/ember-server/src/tls.rs | 26 ++-- 6 files changed, 240 insertions(+), 72 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4e787c55..64bd236b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -179,9 +179,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.37.0" +version = "0.37.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c34dda4df7017c8db52132f0f8a2e0f8161649d15723ed63fc00c82d0f2081a" +checksum = "b092fe214090261288111db7a2b2c2118e5a7f30dc2569f1732c4069a6840549" dependencies = [ "cc", "cmake", @@ -233,7 +233,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.115", ] [[package]] @@ -364,9 +364,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.57" +version = "4.5.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6899ea499e3fb9305a65d5ebf6e3d2248c5fab291f300ad0a704fbe142eae31a" +checksum = "63be97961acde393029492ce0be7a1af7e323e6bae9511ebfac33751be5e6806" dependencies = [ "clap_builder", "clap_derive", @@ -374,9 +374,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.57" +version = "4.5.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b12c8b680195a62a8364d16b8447b01b6c2c8f9aaf68bee653be34d4245e238" +checksum = "7f13174bda5dfd69d7e947827e5af4b0f2f94a4a3ee92912fba07a66150f21e2" dependencies = [ "anstream", "anstyle", @@ -393,14 +393,14 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.115", ] [[package]] name = "clap_lex" -version = "0.7.7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32" +checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" [[package]] name = "clipboard-win" @@ -493,7 +493,7 @@ dependencies = [ "criterion-plot", "futures", "is-terminal", - "itertools", + "itertools 0.10.5", "num-traits", "once_cell", "oorandom", @@ -515,7 +515,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" dependencies = [ "cast", - "itertools", + "itertools 0.10.5", ] [[package]] @@ -596,7 +596,7 @@ dependencies = [ "proc-macro2", "quote", "scratch", - "syn 2.0.114", + "syn 2.0.115", ] [[package]] @@ -610,7 +610,7 @@ dependencies = [ "indexmap", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.115", ] [[package]] @@ -628,7 +628,7 @@ dependencies = [ "indexmap", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.115", ] [[package]] @@ -662,7 +662,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.115", "unicode-xid", ] @@ -769,7 +769,7 @@ dependencies = [ "metrics", "metrics-exporter-prometheus", "rustls", - "rustls-pemfile", + "rustls-pki-types", "subtle", "thiserror 2.0.18", "tikv-jemallocator", @@ -791,7 +791,7 @@ dependencies = [ "rand 0.9.2", "rustls", "rustls-native-certs", - "rustls-pemfile", + "rustls-pki-types", "rustyline", "thiserror 2.0.18", "tokio", @@ -956,7 +956,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.115", ] [[package]] @@ -1022,6 +1022,19 @@ dependencies = [ "wasip2", ] +[[package]] +name = "getrandom" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", + "wasip3", +] + [[package]] name = "ghash" version = "0.5.1" @@ -1242,6 +1255,12 @@ dependencies = [ "cc", ] +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + [[package]] name = "indexmap" version = "2.13.0" @@ -1250,6 +1269,8 @@ checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" dependencies = [ "equivalent", "hashbrown 0.16.1", + "serde", + "serde_core", ] [[package]] @@ -1293,6 +1314,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.17" @@ -1325,11 +1355,17 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + [[package]] name = "libc" -version = "0.2.180" +version = "0.2.181" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" +checksum = "459427e2af2b9c839b132acb702a1c654d95e10f8c326bfc2ad11310e458b1c5" [[package]] name = "libredox" @@ -1546,7 +1582,7 @@ dependencies = [ "proc-macro2", "quote", "semver", - "syn 2.0.114", + "syn 2.0.115", ] [[package]] @@ -1610,7 +1646,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.115", ] [[package]] @@ -1680,6 +1716,16 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.115", +] + [[package]] name = "proc-macro-crate" version = "3.4.0" @@ -1715,10 +1761,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" dependencies = [ "anyhow", - "itertools", + "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.115", ] [[package]] @@ -1940,7 +1986,7 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.115", ] [[package]] @@ -2080,15 +2126,6 @@ dependencies = [ "security-framework", ] -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "rustls-pki-types" version = "1.14.0" @@ -2242,7 +2279,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.115", ] [[package]] @@ -2342,9 +2379,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.114" +version = "2.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" +checksum = "6e614ed320ac28113fa64972c4262d5dbc89deacdfd00c34a3e4cea073243c12" dependencies = [ "proc-macro2", "quote", @@ -2359,12 +2396,12 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.24.0" +version = "3.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c" +checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" dependencies = [ "fastrand", - "getrandom 0.3.4", + "getrandom 0.4.1", "once_cell", "rustix", "windows-sys 0.61.2", @@ -2405,7 +2442,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.115", ] [[package]] @@ -2416,7 +2453,7 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.115", ] [[package]] @@ -2498,7 +2535,7 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.115", ] [[package]] @@ -2547,9 +2584,9 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.0.6+spec-1.1.0" +version = "1.0.7+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" +checksum = "247eaa3197818b831697600aadf81514e577e0cba5eab10f7e064e78ae154df1" dependencies = [ "winnow", ] @@ -2579,7 +2616,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.115", ] [[package]] @@ -2645,9 +2682,9 @@ checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "unicode-ident" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +checksum = "537dd038a89878be9b64dd4bd1b260315c1bb94f4d784956b81e27a088d9a09e" [[package]] name = "unicode-segmentation" @@ -2772,6 +2809,15 @@ dependencies = [ "wit-bindgen", ] +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen", +] + [[package]] name = "wasm-bindgen" version = "0.2.108" @@ -2804,7 +2850,7 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.115", "wasm-bindgen-shared", ] @@ -2817,6 +2863,40 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags", + "hashbrown 0.15.5", + "indexmap", + "semver", +] + [[package]] name = "web-sys" version = "0.3.85" @@ -2879,7 +2959,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.115", ] [[package]] @@ -2890,7 +2970,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.115", ] [[package]] @@ -3096,6 +3176,88 @@ name = "wit-bindgen" version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn 2.0.115", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.115", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] [[package]] name = "wyz" @@ -3123,7 +3285,7 @@ checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.115", ] [[package]] @@ -3134,6 +3296,6 @@ checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" [[package]] name = "zmij" -version = "1.0.19" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff05f8caa9038894637571ae6b9e29466c1f4f829d26c9b28f869a29cbe3445" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/Cargo.toml b/Cargo.toml index 9357a627..d762436b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,9 @@ repository = "https://github.com/kacy/ember" keywords = ["cache", "redis", "key-value", "database", "distributed"] categories = ["caching", "database-implementations"] +[profile.release] +overflow-checks = true + [workspace.dependencies] # async runtime tokio = { version = "1", features = ["full"] } @@ -58,7 +61,7 @@ criterion = { version = "0.5", features = ["html_reports", "async_tokio"] } # tls tokio-rustls = "0.26" rustls = { version = "0.23", default-features = false, features = ["std", "tls12"] } -rustls-pemfile = "2" +rustls-pki-types = { version = "1", features = ["std"] } rustls-native-certs = "0.8" # dynamic protobuf messages diff --git a/crates/ember-cli/Cargo.toml b/crates/ember-cli/Cargo.toml index e01820ea..35e120e4 100644 --- a/crates/ember-cli/Cargo.toml +++ b/crates/ember-cli/Cargo.toml @@ -22,7 +22,7 @@ thiserror = { workspace = true } rand = { workspace = true } tokio-rustls = { workspace = true } rustls = { workspace = true } -rustls-pemfile = { workspace = true } +rustls-pki-types = { workspace = true } rustls-native-certs = { workspace = true } rustyline = "15" colored = "3" diff --git a/crates/ember-cli/src/tls.rs b/crates/ember-cli/src/tls.rs index 10079c9a..decd036a 100644 --- a/crates/ember-cli/src/tls.rs +++ b/crates/ember-cli/src/tls.rs @@ -9,6 +9,7 @@ use std::pin::Pin; use std::sync::Arc; use std::task::{Context, Poll}; +use rustls::pki_types::pem::PemObject; use rustls::pki_types::ServerName; use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; use tokio::net::TcpStream; @@ -128,7 +129,9 @@ fn load_root_certs(ca_cert_path: Option<&str>) -> io::Result, _>>()?; + let certs = rustls::pki_types::CertificateDer::pem_slice_iter(&pem) + .collect::, _>>() + .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e.to_string()))?; if certs.is_empty() { return Err(io::Error::new( diff --git a/crates/ember-server/Cargo.toml b/crates/ember-server/Cargo.toml index 59ead69f..d893e2f0 100644 --- a/crates/ember-server/Cargo.toml +++ b/crates/ember-server/Cargo.toml @@ -36,7 +36,7 @@ subtle = { workspace = true } # tls tokio-rustls = { workspace = true } rustls = { workspace = true } -rustls-pemfile = { workspace = true } +rustls-pki-types = { workspace = true } # optional: better multi-threaded allocation performance tikv-jemallocator = { version = "0.6", optional = true } diff --git a/crates/ember-server/src/tls.rs b/crates/ember-server/src/tls.rs index d642f84b..93f291fd 100644 --- a/crates/ember-server/src/tls.rs +++ b/crates/ember-server/src/tls.rs @@ -12,6 +12,7 @@ use std::sync::Arc; use rustls::pki_types::{CertificateDer, PrivateKeyDer}; use rustls::server::WebPkiClientVerifier; use rustls::RootCertStore; +use rustls_pki_types::pem::PemObject; use thiserror::Error; use tokio_rustls::TlsAcceptor; @@ -43,6 +44,9 @@ pub enum TlsError { #[error("failed to read certificate file: {0}")] CertReadError(#[source] std::io::Error), + #[error("failed to parse PEM certificate: {0}")] + PemError(String), + #[error("failed to read private key file: {0}")] KeyReadError(#[source] std::io::Error), @@ -52,9 +56,6 @@ pub enum TlsError { #[error("no certificates found in file: {0}")] NoCertsFound(String), - #[error("no private key found in file: {0}")] - NoKeyFound(String), - #[error("failed to build TLS config: {0}")] ConfigError(#[from] rustls::Error), @@ -75,10 +76,10 @@ pub fn load_tls_acceptor(config: &TlsConfig) -> Result { } let cert_file = File::open(cert_path).map_err(TlsError::CertReadError)?; - let mut cert_reader = BufReader::new(cert_file); - let certs: Vec> = rustls_pemfile::certs(&mut cert_reader) + let cert_reader = BufReader::new(cert_file); + let certs: Vec> = CertificateDer::pem_reader_iter(cert_reader) .collect::, _>>() - .map_err(TlsError::CertReadError)?; + .map_err(|e| TlsError::PemError(e.to_string()))?; if certs.is_empty() { return Err(TlsError::NoCertsFound(config.cert_file.clone())); @@ -91,10 +92,9 @@ pub fn load_tls_acceptor(config: &TlsConfig) -> Result { } let key_file = File::open(key_path).map_err(TlsError::KeyReadError)?; - let mut key_reader = BufReader::new(key_file); - let key: PrivateKeyDer<'static> = rustls_pemfile::private_key(&mut key_reader) - .map_err(TlsError::KeyReadError)? - .ok_or_else(|| TlsError::NoKeyFound(config.key_file.clone()))?; + let key_reader = BufReader::new(key_file); + let key: PrivateKeyDer<'static> = PrivateKeyDer::from_pem_reader(key_reader) + .map_err(|e| TlsError::PemError(e.to_string()))?; // build server config let server_config = if let Some(ref ca_path) = config.ca_cert_file { @@ -105,10 +105,10 @@ pub fn load_tls_acceptor(config: &TlsConfig) -> Result { } let ca_file = File::open(ca_cert_path).map_err(TlsError::CaCertReadError)?; - let mut ca_reader = BufReader::new(ca_file); - let ca_certs: Vec> = rustls_pemfile::certs(&mut ca_reader) + let ca_reader = BufReader::new(ca_file); + let ca_certs: Vec> = CertificateDer::pem_reader_iter(ca_reader) .collect::, _>>() - .map_err(TlsError::CaCertReadError)?; + .map_err(|e| TlsError::PemError(e.to_string()))?; let mut root_store = RootCertStore::empty(); for cert in ca_certs {