update features of hyper-rutstls with aws-lc-rs and platform-verifier

This commit is contained in:
Jun Kurihara 2024-06-07 14:18:09 +09:00
commit dfe764f41e
No known key found for this signature in database
GPG key ID: 48ADFD173ED22B03
5 changed files with 17 additions and 20 deletions

View file

@ -10,6 +10,7 @@
### Improvement ### Improvement
- Refactor: lots of minor improvements - Refactor: lots of minor improvements
- Change the certificate verifier from `rustls-native-certs` to `rustls-platform-verifier` to use the system's default root cert store for better client (forwarder) performance in `hyper-rustls`.
## 0.7.1 ## 0.7.1

View file

@ -1,5 +1,5 @@
[workspace.package] [workspace.package]
version = "0.8.0-alpha.0" version = "0.8.0-alpha.1"
authors = ["Jun Kurihara"] authors = ["Jun Kurihara"]
homepage = "https://github.com/junkurihara/rust-rpxy" homepage = "https://github.com/junkurihara/rust-rpxy"
repository = "https://github.com/junkurihara/rust-rpxy" repository = "https://github.com/junkurihara/rust-rpxy"

View file

@ -13,8 +13,8 @@ publish.workspace = true
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[features] [features]
# default = ["http3-quinn", "cache", "rustls-backend"] default = ["http3-quinn", "cache", "rustls-backend"]
default = ["http3-s2n", "cache", "rustls-backend"] # default = ["http3-s2n", "cache", "rustls-backend"]
http3-quinn = ["rpxy-lib/http3-quinn"] http3-quinn = ["rpxy-lib/http3-quinn"]
http3-s2n = ["rpxy-lib/http3-s2n"] http3-s2n = ["rpxy-lib/http3-s2n"]
native-tls-backend = ["rpxy-lib/native-tls-backend"] native-tls-backend = ["rpxy-lib/native-tls-backend"]
@ -42,7 +42,7 @@ async-trait = "0.1.80"
# config # config
clap = { version = "4.5.4", features = ["std", "cargo", "wrap_help"] } clap = { version = "4.5.6", features = ["std", "cargo", "wrap_help"] }
toml = { version = "0.8.14", default-features = false, features = ["parse"] } toml = { version = "0.8.14", default-features = false, features = ["parse"] }
hot_reload = "0.1.5" hot_reload = "0.1.5"

View file

@ -13,8 +13,8 @@ publish.workspace = true
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[features] [features]
default = ["http3-s2n", "sticky-cookie", "cache", "rustls-backend"] # default = ["http3-s2n", "sticky-cookie", "cache", "rustls-backend"]
# default = ["http3-quinn", "sticky-cookie", "cache", "rustls-backend"] default = ["http3-quinn", "sticky-cookie", "cache", "rustls-backend"]
http3-quinn = ["socket2", "quinn", "h3", "h3-quinn", "rpxy-certs/http3"] http3-quinn = ["socket2", "quinn", "h3", "h3-quinn", "rpxy-certs/http3"]
http3-s2n = [ http3-s2n = [
"h3", "h3",
@ -64,11 +64,13 @@ hyper-tls = { version = "0.6.0", features = [
"alpn", "alpn",
"vendored", "vendored",
], optional = true } ], optional = true }
hyper-rustls = { version = "0.27.2", default-features = false, features = [ # TODO: Work around to enable rustls-platform-verifier feature: https://github.com/rustls/hyper-rustls/pull/276
"ring", # hyper-rustls = { version = "0.27.2", default-features = false, features = [
"native-tokio", hyper-rustls = { git = "https://github.com/junkurihara/hyper-rustls", branch = "fix/builder-feature-platform-verifier", features = [
"aws-lc-rs",
"http1", "http1",
"http2", "http2",
"rustls-platform-verifier",
], optional = true } ], optional = true }
# tls and cert management for server # tls and cert management for server

View file

@ -212,21 +212,18 @@ where
info!("Mozilla WebPKI root certs with rustls is used for the connection to backend applications"); info!("Mozilla WebPKI root certs with rustls is used for the connection to backend applications");
#[cfg(not(feature = "rustls-backend-webpki"))] #[cfg(not(feature = "rustls-backend-webpki"))]
let builder = hyper_rustls::HttpsConnectorBuilder::new().with_native_roots()?; let builder = hyper_rustls::HttpsConnectorBuilder::new().with_platform_verifier();
#[cfg(not(feature = "rustls-backend-webpki"))] #[cfg(not(feature = "rustls-backend-webpki"))]
let builder_h2 = hyper_rustls::HttpsConnectorBuilder::new().with_native_roots()?; let builder_h2 = hyper_rustls::HttpsConnectorBuilder::new().with_platform_verifier();
#[cfg(not(feature = "rustls-backend-webpki"))] #[cfg(not(feature = "rustls-backend-webpki"))]
info!("Native cert store with rustls is used for the connection to backend applications"); info!("Platform verifier with rustls is used for the connection to backend applications");
let mut http = HttpConnector::new(); let mut http = HttpConnector::new();
http.enforce_http(false); http.enforce_http(false);
http.set_reuse_address(true); http.set_reuse_address(true);
http.set_keepalive(Some(_globals.proxy_config.upstream_idle_timeout)); http.set_keepalive(Some(_globals.proxy_config.upstream_idle_timeout));
let connector = builder let connector = builder.https_or_http().enable_all_versions().wrap_connector(http.clone());
.https_or_http()
.enable_all_versions()
.wrap_connector(http.clone());
let connector_h2 = builder_h2.https_or_http().enable_http2().wrap_connector(http); let connector_h2 = builder_h2.https_or_http().enable_http2().wrap_connector(http);
let inner = Client::builder(LocalExecutor::new(_globals.runtime_handle.clone())).build::<_, B1>(connector); let inner = Client::builder(LocalExecutor::new(_globals.runtime_handle.clone())).build::<_, B1>(connector);
let inner_h2 = Client::builder(LocalExecutor::new(_globals.runtime_handle.clone())).build::<_, B1>(connector_h2); let inner_h2 = Client::builder(LocalExecutor::new(_globals.runtime_handle.clone())).build::<_, B1>(connector_h2);
@ -243,10 +240,7 @@ where
#[cfg(feature = "cache")] #[cfg(feature = "cache")]
/// Build synthetic request to cache /// Build synthetic request to cache
fn build_synth_req_for_cache<T>(req: &Request<T>) -> Request<()> { fn build_synth_req_for_cache<T>(req: &Request<T>) -> Request<()> {
let mut builder = Request::builder() let mut builder = Request::builder().method(req.method()).uri(req.uri()).version(req.version());
.method(req.method())
.uri(req.uri())
.version(req.version());
// TODO: omit extensions. is this approach correct? // TODO: omit extensions. is this approach correct?
for (header_key, header_value) in req.headers() { for (header_key, header_value) in req.headers() {
builder = builder.header(header_key, header_value); builder = builder.header(header_key, header_value);