Skip to content

Commit 7b39efc

Browse files
authored
Merge pull request #11 from n0-computer/rustls-23
Upgrade to [email protected]
2 parents c838cd2 + a24232c commit 7b39efc

11 files changed

+44
-38
lines changed

Cargo.toml

+7-6
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,22 @@ serde = { version = "1.0.137", features = ["derive"] }
1818
ring = { version = "0.17.0", features = ["std"] }
1919
base64 = "0.21.0"
2020
log = "0.4.17"
21-
webpki-roots = "0.25.2"
21+
webpki-roots = "0.26"
2222
pem = "3.0"
2323
thiserror = "1.0.31"
2424
x509-parser = "0.16"
2525
chrono = { version = "0.4.24", default-features = false, features = ["clock"] }
2626
url = "2.2.2"
2727
async-trait = "0.1.53"
28-
rustls = "0.21"
28+
rustls = { version = "0.23", default-features = false, features = ["ring"] }
29+
time = "0.3.36" # force the transitive dependency to a more recent minimal version. The build fails with 0.3.20
2930

3031
tokio = { version = "1.20.1", default-features = false }
31-
tokio-rustls = { version = "0.24" }
32-
reqwest = { version = "0.11.19", default-features = false, features = ["rustls-tls"] }
32+
tokio-rustls = { version = "0.26", default-features = false, features = ["tls12"] }
33+
reqwest = { version = "0.12", default-features = false, features = ["rustls-tls"] }
3334

3435
# Axum
35-
axum-server = { version = "0.6", features = ["tls-rustls"], optional = true }
36+
axum-server = { version = "0.7", features = ["tokio-rustls"], optional = true }
3637

3738
[dependencies.proc-macro2]
3839
# This is a transitive dependency, we specify it to make sure we have
@@ -54,7 +55,7 @@ axum = "0.7"
5455
tokio = { version="1.19.2", features = ["full"] }
5556
tokio-stream = { version="0.1.9", features = ["net"] }
5657
tokio-util = { version="0.7.3", features = ["compat"] }
57-
warp = "0.3.4"
58+
warp = "0.3.7"
5859

5960
[package.metadata.docs.rs]
6061
all-features = true

examples/low_level.rs

-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ async fn main() {
4242
.directory_lets_encrypt(args.prod)
4343
.state();
4444
let rustls_config = ServerConfig::builder()
45-
.with_safe_defaults()
4645
.with_no_client_auth()
4746
.with_cert_resolver(state.resolver());
4847
let acceptor = state.acceptor();

examples/low_level_axum.rs

-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ async fn main() {
4242
.directory_lets_encrypt(args.prod)
4343
.state();
4444
let rustls_config = ServerConfig::builder()
45-
.with_safe_defaults()
4645
.with_no_client_auth()
4746
.with_cert_resolver(state.resolver());
4847
let acceptor = state.axum_acceptor(Arc::new(rustls_config));

src/acceptor.rs

-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ pub struct AcmeAcceptor {
1818
impl AcmeAcceptor {
1919
pub(crate) fn new(resolver: Arc<ResolvesServerCertAcme>) -> Self {
2020
let mut config = ServerConfig::builder()
21-
.with_safe_defaults()
2221
.with_no_client_auth()
2322
.with_cert_resolver(resolver);
2423
config.alpn_protocols.push(ACME_TLS_ALPN_NAME.to_vec());

src/acme.rs

+11-4
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,11 @@ use rcgen::{Certificate, CustomExtension, Error as RcgenError, PKCS_ECDSA_P256_S
88
use ring::error::{KeyRejected, Unspecified};
99
use ring::rand::SystemRandom;
1010
use ring::signature::{EcdsaKeyPair, EcdsaSigningAlgorithm, ECDSA_P256_SHA256_FIXED_SIGNING};
11-
use rustls::sign::{any_ecdsa_type, CertifiedKey};
12-
use rustls::{ClientConfig, PrivateKey};
11+
use rustls::{crypto::ring::sign::any_ecdsa_type, sign::CertifiedKey};
12+
use rustls::{
13+
pki_types::{PrivateKeyDer, PrivatePkcs8KeyDer},
14+
ClientConfig,
15+
};
1316
use serde::{Deserialize, Serialize};
1417
use serde_json::json;
1518
use thiserror::Error;
@@ -178,8 +181,12 @@ impl Account {
178181
params.alg = &PKCS_ECDSA_P256_SHA256;
179182
params.custom_extensions = vec![CustomExtension::new_acme_identifier(key_auth.as_ref())];
180183
let cert = Certificate::from_params(params)?;
181-
let pk = any_ecdsa_type(&PrivateKey(cert.serialize_private_key_der())).unwrap();
182-
let certified_key = CertifiedKey::new(vec![rustls::Certificate(cert.serialize_der()?)], pk);
184+
let pk_bytes = cert.serialize_private_key_der();
185+
let pk_der: PrivatePkcs8KeyDer = pk_bytes.into();
186+
let pk_der: PrivateKeyDer = pk_der.into();
187+
let pk = any_ecdsa_type(&pk_der).unwrap();
188+
let cert_bytes = cert.serialize_der()?;
189+
let certified_key = CertifiedKey::new(vec![cert_bytes.into()], pk);
183190
Ok((challenge, certified_key))
184191
}
185192
}

src/config.rs

+9-8
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,17 @@ impl AcmeConfig<Infallible, Infallible> {
5050
///
5151
pub fn new(domains: impl IntoIterator<Item = impl AsRef<str>>) -> Self {
5252
let mut root_store = RootCertStore::empty();
53-
root_store.add_trust_anchors(TLS_SERVER_ROOTS.iter().map(|ta| {
54-
rustls::OwnedTrustAnchor::from_subject_spki_name_constraints(
55-
ta.subject,
56-
ta.spki,
57-
ta.name_constraints,
58-
)
59-
}));
53+
root_store.extend(
54+
TLS_SERVER_ROOTS
55+
.iter()
56+
.map(|ta| rustls::pki_types::TrustAnchor {
57+
subject: ta.subject.clone(),
58+
subject_public_key_info: ta.subject_public_key_info.clone(),
59+
name_constraints: ta.name_constraints.clone(),
60+
}),
61+
);
6062
let client_config = Arc::new(
6163
ClientConfig::builder()
62-
.with_safe_defaults()
6364
.with_root_certificates(root_store)
6465
.with_no_client_auth(),
6566
);

src/https_helper.rs

+3-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
use rustls::client::InvalidDnsNameError;
2-
use rustls::ClientConfig;
3-
use std::sync::Arc;
1+
use rustls::{pki_types::InvalidDnsNameError, ClientConfig};
42
use thiserror::Error;
53

64
pub use reqwest::Response;
@@ -23,15 +21,14 @@ impl From<Method> for reqwest::Method {
2321
}
2422

2523
pub(crate) async fn https(
26-
client_config: &Arc<ClientConfig>,
24+
client_config: &ClientConfig,
2725
url: impl AsRef<str>,
2826
method: Method,
2927
body: Option<String>,
3028
) -> Result<Response, HttpsRequestError> {
3129
let method: reqwest::Method = method.into();
32-
let client_config: ClientConfig = client_config.as_ref().clone();
3330
let client = reqwest::ClientBuilder::new()
34-
.use_preconfigured_tls(client_config)
31+
.use_preconfigured_tls(client_config.clone())
3532
.build()?;
3633
let mut request = client.request(method, url.as_ref());
3734
if let Some(body) = body {

src/incoming.rs

-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ impl<
5050
alpn_protocols: Vec<Vec<u8>>,
5151
) -> Self {
5252
let mut config = ServerConfig::builder()
53-
.with_safe_defaults()
5453
.with_no_client_auth()
5554
.with_cert_resolver(state.resolver());
5655
config.alpn_protocols = alpn_protocols;

src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@
108108
//! [rustls](https://github.com/ctz/rustls),
109109
//! [tokio-rustls](https://github.com/tokio-rs/tls/tree/master/tokio-rustls) and many others.
110110
111-
#![cfg_attr(doc_auto_cfg, feature(doc_auto_cfg))]
111+
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
112112

113113
mod acceptor;
114114
pub mod acme;

src/resolver.rs

+2
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@ use std::collections::BTreeMap;
55
use std::sync::Arc;
66
use std::sync::Mutex;
77

8+
#[derive(Debug)]
89
pub struct ResolvesServerCertAcme {
910
inner: Mutex<Inner>,
1011
}
1112

13+
#[derive(Debug)]
1214
struct Inner {
1315
cert: Option<Arc<CertifiedKey>>,
1416
auth_keys: BTreeMap<String, Arc<CertifiedKey>>,

src/state.rs

+11-9
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ use chrono::{DateTime, TimeZone, Utc};
1010
use futures::future::try_join_all;
1111
use futures::{ready, FutureExt, Stream};
1212
use rcgen::{CertificateParams, DistinguishedName, Error as RcgenError, PKCS_ECDSA_P256_SHA256};
13-
use rustls::sign::{any_ecdsa_type, CertifiedKey};
14-
use rustls::Certificate as RustlsCertificate;
15-
use rustls::PrivateKey;
13+
use rustls::crypto::ring::sign::any_ecdsa_type;
14+
use rustls::pki_types::{CertificateDer as RustlsCertificate, PrivateKeyDer, PrivatePkcs8KeyDer};
15+
use rustls::sign::CertifiedKey;
1616
use thiserror::Error;
1717
use tokio::io::{AsyncRead, AsyncWrite};
1818
use tokio::time::Sleep;
@@ -31,6 +31,7 @@ pub fn after(d: std::time::Duration) -> Timer {
3131
Box::pin(tokio::time::sleep(d))
3232
}
3333

34+
#[allow(clippy::type_complexity)]
3435
pub struct AcmeState<EC: Debug = Infallible, EA: Debug = EC> {
3536
config: Arc<AcmeConfig<EC, EA>>,
3637
resolver: Arc<ResolvesServerCertAcme>,
@@ -162,15 +163,16 @@ impl<EC: 'static + Debug, EA: 'static + Debug> AcmeState<EC, EA> {
162163
if pems.len() < 2 {
163164
return Err(CertParseError::TooFewPem(pems.len()));
164165
}
165-
let pk = match any_ecdsa_type(&PrivateKey(pems.remove(0).into_contents())) {
166+
let pk_bytes = pems.remove(0).into_contents();
167+
let pk_der: PrivatePkcs8KeyDer = pk_bytes.into();
168+
let pk: PrivateKeyDer = pk_der.into();
169+
let pk = match any_ecdsa_type(&pk) {
166170
Ok(pk) => pk,
167171
Err(_) => return Err(CertParseError::InvalidPrivateKey),
168172
};
169-
let cert_chain: Vec<RustlsCertificate> = pems
170-
.into_iter()
171-
.map(|p| RustlsCertificate(p.into_contents()))
172-
.collect();
173-
let validity = match parse_x509_certificate(cert_chain[0].0.as_slice()) {
173+
let cert_chain: Vec<RustlsCertificate> =
174+
pems.into_iter().map(|p| p.into_contents().into()).collect();
175+
let validity = match parse_x509_certificate(cert_chain[0].as_ref()) {
174176
Ok((_, cert)) => {
175177
let validity = cert.validity();
176178
[validity.not_before, validity.not_after]

0 commit comments

Comments
 (0)