diff --git a/Cargo.lock b/Cargo.lock index 37b054a96..5b2f53222 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -170,12 +170,15 @@ dependencies = [ "futures-io", "futures-util", "log", + "native-tls", "pin-project-lite", "rustls-native-certs", "rustls-pki-types", "tokio", + "tokio-native-tls", "tokio-rustls", "tungstenite", + "webpki-roots", ] [[package]] @@ -2699,6 +2702,7 @@ dependencies = [ "http 1.0.0", "httparse", "log", + "native-tls", "rand", "rustls", "rustls-pki-types", @@ -2885,6 +2889,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-roots" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" + [[package]] name = "which" version = "4.4.2" diff --git a/rumqttc/Cargo.toml b/rumqttc/Cargo.toml index 8c5fa31ff..be6159f68 100644 --- a/rumqttc/Cargo.toml +++ b/rumqttc/Cargo.toml @@ -17,8 +17,9 @@ rustdoc-args = ["--cfg", "docsrs"] [features] default = ["use-rustls"] -use-rustls = ["dep:tokio-rustls", "dep:rustls-webpki", "dep:rustls-pemfile", "dep:rustls-native-certs"] -use-native-tls = ["dep:tokio-native-tls", "dep:native-tls"] +use-rustls = ["dep:tokio-rustls", "dep:rustls-webpki", "dep:rustls-pemfile", "dep:rustls-native-certs", +"async-tungstenite?/tokio-rustls-webpki-roots", "async-tungstenite?/tokio-rustls-native-certs"] +use-native-tls = ["dep:tokio-native-tls", "dep:native-tls", "async-tungstenite?/tokio-native-tls"] websocket = ["dep:async-tungstenite", "dep:ws_stream_tungstenite", "dep:http"] proxy = ["dep:async-http-proxy"] diff --git a/rumqttc/src/eventloop.rs b/rumqttc/src/eventloop.rs index a8aee76c7..9e3b52e7d 100644 --- a/rumqttc/src/eventloop.rs +++ b/rumqttc/src/eventloop.rs @@ -364,7 +364,10 @@ async fn network_connect( let (domain, port) = match options.transport() { #[cfg(feature = "websocket")] Transport::Ws => split_url(&options.broker_addr)?, - #[cfg(all(feature = "use-rustls", feature = "websocket"))] + #[cfg(all( + any(feature = "use-rustls", feature = "use-native-tls"), + feature = "websocket" + ))] Transport::Wss(_) => split_url(&options.broker_addr)?, _ => options.broker_address(), }; @@ -415,7 +418,10 @@ async fn network_connect( Network::new(WsStream::new(socket), options.max_incoming_packet_size) } - #[cfg(all(feature = "use-rustls", feature = "websocket"))] + #[cfg(all( + any(feature = "use-rustls", feature = "use-native-tls"), + feature = "websocket" + ))] Transport::Wss(tls_config) => { let mut request = options.broker_addr.as_str().into_client_request()?; request @@ -426,7 +432,10 @@ async fn network_connect( request = request_modifier(request).await; } + #[cfg(feature = "use-rustls")] let connector = tls::rustls_connector(&tls_config).await?; + #[cfg(feature = "use-native-tls")] + let connector = tls::native_tls_connector(&tls_config).await?; let (socket, response) = async_tungstenite::tokio::client_async_tls_with_connector( request, @@ -434,6 +443,7 @@ async fn network_connect( Some(connector), ) .await?; + validate_response_headers(response)?; Network::new(WsStream::new(socket), options.max_incoming_packet_size) diff --git a/rumqttc/src/lib.rs b/rumqttc/src/lib.rs index 43dbb3bed..bc2b5c6f7 100644 --- a/rumqttc/src/lib.rs +++ b/rumqttc/src/lib.rs @@ -248,7 +248,10 @@ pub enum Transport { #[cfg(feature = "websocket")] #[cfg_attr(docsrs, doc(cfg(feature = "websocket")))] Ws, - #[cfg(all(feature = "use-rustls", feature = "websocket"))] + #[cfg(all( + any(feature = "use-rustls", feature = "use-native-tls"), + feature = "websocket" + ))] #[cfg_attr(docsrs, doc(cfg(all(feature = "use-rustls", feature = "websocket"))))] Wss(TlsConfiguration), } @@ -320,14 +323,32 @@ impl Transport { Self::wss_with_config(config) } - #[cfg(all(feature = "use-rustls", feature = "websocket"))] - #[cfg_attr(docsrs, doc(cfg(all(feature = "use-rustls", feature = "websocket"))))] + #[cfg(all( + any(feature = "use-rustls", feature = "use-native-tls"), + feature = "websocket" + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + any(feature = "use-rustls", feature = "use-native-tls"), + feature = "websocket" + ))) + )] pub fn wss_with_config(tls_config: TlsConfiguration) -> Self { Self::Wss(tls_config) } - #[cfg(all(feature = "use-rustls", feature = "websocket"))] - #[cfg_attr(docsrs, doc(cfg(all(feature = "use-rustls", feature = "websocket"))))] + #[cfg(all( + any(feature = "use-rustls", feature = "use-native-tls"), + feature = "websocket" + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + any(feature = "use-rustls", feature = "use-native-tls"), + feature = "websocket" + ))) + )] pub fn wss_with_default_config() -> Self { Self::Wss(Default::default()) } @@ -376,6 +397,13 @@ impl Default for TlsConfiguration { } } +#[cfg(feature = "use-native-tls")] +impl Default for TlsConfiguration { + fn default() -> Self { + Self::Native + } +} + #[cfg(feature = "use-rustls")] impl From for TlsConfiguration { fn from(config: ClientConfig) -> Self { diff --git a/rumqttc/src/v5/eventloop.rs b/rumqttc/src/v5/eventloop.rs index 36c10971d..30a165133 100644 --- a/rumqttc/src/v5/eventloop.rs +++ b/rumqttc/src/v5/eventloop.rs @@ -299,7 +299,10 @@ async fn network_connect(options: &MqttOptions) -> Result split_url(&options.broker_addr)?, - #[cfg(all(feature = "use-rustls", feature = "websocket"))] + #[cfg(all( + any(feature = "use-rustls", feature = "use-native-tls"), + feature = "websocket" + ))] Transport::Wss(_) => split_url(&options.broker_addr)?, _ => options.broker_address(), }; @@ -354,7 +357,10 @@ async fn network_connect(options: &MqttOptions) -> Result { let mut request = options.broker_addr.as_str().into_client_request()?; request @@ -365,7 +371,10 @@ async fn network_connect(options: &MqttOptions) -> Result