Skip to content

Commit 1343531

Browse files
authored
Upgrade to rustls v0.22.x (#40)
* update rustls to version 0.22 * remove useless NoCertificateVerification
1 parent 74140d4 commit 1343531

File tree

4 files changed

+32
-56
lines changed

4 files changed

+32
-56
lines changed

Cargo.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,19 @@ reqwest = { version = "0.11", default-features = false, features = [
2929
"rustls-tls",
3030
"json",
3131
] }
32-
rustls = { version = "0.21", features = ["dangerous_configuration"] }
33-
rustls-pemfile = "1.0"
32+
rustls = { version = "0.22" }
33+
rustls-pemfile = "2.0"
3434
serde = { version = "1.0", features = ["derive"] }
3535
serde_json = "1.0"
3636
socks5-impl = "0.5"
3737
thiserror = "1.0"
3838
tokio = { version = "1.35", features = ["full"] }
39-
tokio-rustls = "0.24"
39+
tokio-rustls = "0.25"
4040
tokio-tungstenite = { version = "0.21", features = ["rustls-tls-webpki-roots"] }
4141
trust-dns-proto = "0.23"
4242
tungstenite = { version = "0.21", features = ["rustls-tls-webpki-roots"] }
4343
url = "2.5"
44-
webpki = { package = "rustls-webpki", version = "0.101", features = [
44+
webpki = { package = "rustls-webpki", version = "0.102", features = [
4545
"alloc",
4646
"std",
4747
] }

src/error.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ pub enum Error {
3636
#[error("rustls::error::Error {0}")]
3737
Rustls(#[from] rustls::Error),
3838

39-
#[error("tokio_rustls::rustls::client::InvalidDnsNameError {0}")]
40-
InvalidDnsName(#[from] tokio_rustls::rustls::client::InvalidDnsNameError),
39+
#[error("rustls::pki_types::InvalidDnsNameError {0}")]
40+
InvalidDnsName(#[from] rustls::pki_types::InvalidDnsNameError),
4141

4242
#[error("httparse::Error {0}")]
4343
Httparse(#[from] httparse::Error),

src/server.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,11 @@ pub async fn run_server(config: &Config, exiting_flag: Option<Arc<AtomicBool>>)
6464
}
6565
});
6666

67-
let svr_cfg = if let (Some(certs), Some(keys)) = (certs, keys) {
68-
let key = keys.get(0).ok_or("no keys")?.clone();
67+
let svr_cfg = if let (Some(certs), Some(mut keys)) = (certs, keys) {
68+
let _key = keys.get(0).ok_or("no keys")?;
6969
rustls::ServerConfig::builder()
70-
.with_safe_defaults()
7170
.with_no_client_auth()
72-
.with_single_cert(certs, key)
71+
.with_single_cert(certs, keys.remove(0))
7372
.ok()
7473
} else {
7574
None

src/tls.rs

Lines changed: 23 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,89 +1,66 @@
11
use crate::error::Result;
2+
use rustls::{
3+
pki_types::{CertificateDer, PrivateKeyDer, ServerName},
4+
RootCertStore,
5+
};
26
use std::{
37
fs::File,
48
io::BufReader,
59
net::SocketAddr,
610
path::{Path, PathBuf},
7-
sync::Arc,
811
};
912
use tokio::net::TcpStream;
10-
use tokio_rustls::{
11-
client::TlsStream,
12-
rustls::{self, Certificate, OwnedTrustAnchor, PrivateKey, RootCertStore},
13-
TlsConnector,
14-
};
13+
use tokio_rustls::{client::TlsStream, TlsConnector};
1514

1615
pub(crate) fn retrieve_root_cert_store_for_client(cafile: &Option<PathBuf>) -> Result<RootCertStore> {
1716
let mut root_cert_store = rustls::RootCertStore::empty();
1817
let mut done = false;
1918
if let Some(cafile) = cafile {
2019
if cafile.exists() {
2120
let mut pem = BufReader::new(File::open(cafile)?);
22-
let certs = rustls_pemfile::certs(&mut pem)?;
23-
let trust_anchors = certs.iter().map(|cert| {
24-
if let Ok(ta) = webpki::TrustAnchor::try_from_cert_der(&cert[..]) {
25-
OwnedTrustAnchor::from_subject_spki_name_constraints(ta.subject, ta.spki, ta.name_constraints)
26-
} else {
27-
OwnedTrustAnchor::from_subject_spki_name_constraints(vec![], vec![], Some(vec![]))
28-
}
29-
});
30-
root_cert_store.add_trust_anchors(trust_anchors);
21+
for cert in rustls_pemfile::certs(&mut pem) {
22+
root_cert_store.add(cert?)?;
23+
}
3124
done = true;
3225
}
3326
}
3427
if !done {
35-
root_cert_store.add_trust_anchors(webpki_roots::TLS_SERVER_ROOTS.iter().map(|ta| {
36-
let name_constraints = ta.name_constraints.clone().map(|nc| nc.as_ref().to_vec());
37-
OwnedTrustAnchor::from_subject_spki_name_constraints(ta.subject.as_ref(), ta.subject_public_key_info.as_ref(), name_constraints)
38-
}));
28+
root_cert_store.extend(webpki_roots::TLS_SERVER_ROOTS.iter().cloned());
3929
}
4030
Ok(root_cert_store)
4131
}
4232

43-
#[derive(Debug)]
44-
pub struct NoCertificateVerification {}
45-
46-
impl rustls::client::ServerCertVerifier for NoCertificateVerification {
47-
fn verify_server_cert(
48-
&self,
49-
_end_entity: &rustls::Certificate,
50-
_intermediates: &[rustls::Certificate],
51-
_server_name: &rustls::ServerName,
52-
_scts: &mut dyn Iterator<Item = &[u8]>,
53-
_ocsp: &[u8],
54-
_now: std::time::SystemTime,
55-
) -> Result<rustls::client::ServerCertVerified, rustls::Error> {
56-
Ok(rustls::client::ServerCertVerified::assertion())
57-
}
58-
}
59-
6033
pub(crate) async fn create_tls_client_stream(
6134
root_cert_store: RootCertStore,
6235
addr: SocketAddr,
6336
domain: &str,
6437
) -> Result<TlsStream<TcpStream>> {
65-
let mut config = rustls::ClientConfig::builder()
66-
.with_safe_defaults()
38+
let config = rustls::ClientConfig::builder()
6739
.with_root_certificates(root_cert_store)
6840
.with_no_client_auth();
69-
config.dangerous().set_certificate_verifier(Arc::new(NoCertificateVerification {}));
7041
let connector = TlsConnector::from(std::sync::Arc::new(config));
7142

7243
let stream = crate::tcp_stream::create(addr).await?;
7344

74-
let domain = rustls::ServerName::try_from(domain)?;
45+
let domain = ServerName::try_from(domain)?.to_owned();
7546

7647
let stream = connector.connect(domain, stream).await?;
7748

7849
Ok(stream)
7950
}
8051

81-
pub(crate) fn server_load_certs(path: &Path) -> Result<Vec<Certificate>> {
82-
let certs = rustls_pemfile::certs(&mut BufReader::new(File::open(path)?))?;
83-
Ok(certs.into_iter().map(Certificate).collect())
52+
pub(crate) fn server_load_certs(path: &Path) -> Result<Vec<CertificateDer<'static>>> {
53+
let mut res = vec![];
54+
for cert in rustls_pemfile::certs(&mut BufReader::new(File::open(path)?)) {
55+
res.push(cert?);
56+
}
57+
Ok(res)
8458
}
8559

86-
pub(crate) fn server_load_keys(path: &Path) -> Result<Vec<PrivateKey>> {
87-
let keys = rustls_pemfile::rsa_private_keys(&mut BufReader::new(File::open(path)?))?;
88-
Ok(keys.into_iter().map(PrivateKey).collect())
60+
pub(crate) fn server_load_keys(path: &Path) -> Result<Vec<PrivateKeyDer<'static>>> {
61+
let mut res = vec![];
62+
for key in rustls_pemfile::rsa_private_keys(&mut BufReader::new(File::open(path)?)) {
63+
res.push(PrivateKeyDer::from(key?));
64+
}
65+
Ok(res)
8966
}

0 commit comments

Comments
 (0)