Compare commits

..
Author SHA1 Message Date
5e0007fab6 Clippy 2026-08-24 09:20:01 +02:00
b475ad2c85 Servername callback 2026-08-24 09:12:13 +02:00
5 changed files with 45 additions and 42 deletions

View file

@ -53,11 +53,10 @@ fn main() {
server_name.map_or_else(|| panic!("NO HOST"), str::to_string) server_name.map_or_else(|| panic!("NO HOST"), str::to_string)
}, },
remote_port: "443".to_string(), remote_port: "443".to_string(),
tls_config: tls_config: TLSConfig::FILE {
TLSConfig::FILE { certificate_path: "/dev/shm/exp/certs/prime256v1/apple.com.crt".to_string(),
certificate_path: "/dev/shm/exp/certs/prime256v1/apple.com.crt".to_string(), private_key_path: "/dev/shm/exp/certs/prime256v1/apple.com.key".to_string(),
private_key_path: "/dev/shm/exp/certs/prime256v1/apple.com.key".to_string(), },
},
}, },
); );

View file

@ -74,7 +74,6 @@ impl DownStreamInner {
} else if byte_count == -1 { } else if byte_count == -1 {
continue; continue;
} }
} else {
} }
} }
} }
@ -138,7 +137,6 @@ impl DownStreamInner {
} else if byte_count == -1 { } else if byte_count == -1 {
continue; continue;
} }
} else {
} }
} }
} }
@ -186,7 +184,7 @@ impl DownStreamInner {
}, },
} }
} }
return Some(data_length); Some(data_length)
} }
} }
@ -257,7 +255,6 @@ impl UpStreamInner {
} else if byte_count == -1 { } else if byte_count == -1 {
continue; continue;
} }
} else {
} }
} }
} }
@ -317,7 +314,6 @@ impl UpStreamInner {
} else if byte_count == -1 { } else if byte_count == -1 {
continue; continue;
} }
} else {
} }
} }
} }
@ -365,6 +361,6 @@ impl UpStreamInner {
}, },
} }
} }
return Some(data_length); Some(data_length)
} }
} }

View file

@ -61,27 +61,25 @@
//! } //! }
//! } //! }
//! //!
//! fn main() { //! // Create new SSLRelay object
//! // Create new SSLRelay object //! let mut relay = sslrelay::SSLRelay::new(
//! let mut relay = sslrelay::SSLRelay::new( //! Handler,
//! Handler, //! RelayConfig {
//! RelayConfig { //! downstream_data_type: TCPDataType::TLS,
//! downstream_data_type: TCPDataType::TLS, //! upstream_data_type: TCPDataType::TLS,
//! upstream_data_type: TCPDataType::TLS, //! bind_host: "0.0.0.0".to_string(),
//! bind_host: "0.0.0.0".to_string(), //! bind_port: "443".to_string(),
//! bind_port: "443".to_string(), //! remote_host: |_| "remote.com",
//! remote_host: |_| "remote.com", //! remote_port: "443".to_string(),
//! remote_port: "443".to_string(), //! tls_config: TLSConfig::FILE {
//! tls_config: TLSConfig::FILE { //! certificate_path: "./tls.crt".to_string(),
//! certificate_path: "./tls.crt".to_string(), //! private_key_path: "./tls.key".to_string(),
//! private_key_path: "./tls.key".to_string(),
//! },
//! }, //! },
//! ); //! },
//! );
//! //!
//! // Start listening //! // Start listening
//! relay.start(); //! relay.start();
//! }
//! ``` //! ```
use openssl::{ use openssl::{
@ -146,6 +144,12 @@ pub enum TLSConfig {
certificate: Vec<u8>, certificate: Vec<u8>,
private_key: Vec<u8>, private_key: Vec<u8>,
}, },
CALLBACK {
servername_callback: fn(
&mut openssl::ssl::SslRef,
&mut openssl::ssl::SslAlert,
) -> Result<(), openssl::ssl::SniError>,
},
NONE, NONE,
} }

View file

@ -16,7 +16,7 @@ impl<H: HandlerCallbacks + std::marker::Sync + std::marker::Send + Clone + 'stat
} }
/// Starts the SSLRelay connection handling. /// Starts the SSLRelay connection handling.
pub fn start(&mut self) { pub fn start(&mut self) {
let rhost = self.config.remote_host.clone(); let rhost = self.config.remote_host;
let rport = self.config.remote_port.clone(); let rport = self.config.remote_port.clone();
let upstream_data_stream_type = self.config.upstream_data_type; let upstream_data_stream_type = self.config.upstream_data_type;
@ -38,10 +38,11 @@ impl<H: HandlerCallbacks + std::marker::Sync + std::marker::Send + Clone + 'stat
let acceptor = acceptor.clone(); let acceptor = acceptor.clone();
let mut handler_clone = self.handlers.as_ref().unwrap().clone(); let mut handler_clone = self.handlers.as_ref().unwrap().clone();
let r_host = rhost.clone(); let r_host = rhost;
let r_port = rport.clone(); let r_port = rport.clone();
let this_conn_id = conn_id; let this_conn_id = conn_id;
thread::spawn(move || { thread::spawn(move || {
match acceptor.accept(stream) { match acceptor.accept(stream) {
Ok(stream) => { Ok(stream) => {
@ -50,7 +51,7 @@ impl<H: HandlerCallbacks + std::marker::Sync + std::marker::Send + Clone + 'stat
.servername(openssl::ssl::NameType::HOST_NAME); .servername(openssl::ssl::NameType::HOST_NAME);
handler_clone.cb.set_server_name(server_name); handler_clone.cb.set_server_name(server_name);
let remote_host = (r_host)(server_name); let remote_host = (r_host)(server_name);
// FULL DUPLEX OBJECT CREATION HERE // FULL DUPLEX OBJECT CREATION HERE
match FullDuplexTcp::new( match FullDuplexTcp::new(
DataStreamType::TLS(stream), DataStreamType::TLS(stream),
@ -90,7 +91,7 @@ impl<H: HandlerCallbacks + std::marker::Sync + std::marker::Send + Clone + 'stat
Ok(stream) => { Ok(stream) => {
let handler_clone = self.handlers.as_ref().unwrap().clone(); let handler_clone = self.handlers.as_ref().unwrap().clone();
let r_host = rhost.clone(); let r_host = rhost;
let r_port = rport.clone(); let r_port = rport.clone();
let this_conn_id = conn_id; let this_conn_id = conn_id;
@ -154,6 +155,11 @@ impl<H: HandlerCallbacks + std::marker::Sync + std::marker::Send + Clone + 'stat
.unwrap(); .unwrap();
acceptor.set_private_key(private_key.as_ref()).unwrap(); acceptor.set_private_key(private_key.as_ref()).unwrap();
} }
TLSConfig::CALLBACK {
servername_callback,
} => {
acceptor.set_servername_callback(*servername_callback);
}
TLSConfig::NONE => { TLSConfig::NONE => {
panic!( panic!(
"[SSLRelay Error] Specified NONE for TLSConfig and downstream_data_type as \ "[SSLRelay Error] Specified NONE for TLSConfig and downstream_data_type as \

View file

@ -311,9 +311,8 @@ impl<H: HandlerCallbacks + std::marker::Sync + std::marker::Send + Clone + 'stat
Err(e) => { Err(e) => {
Self::handle_error( Self::handle_error(
format!( format!(
"Can't connect to remote host: {}\nErr: {}", "Can't connect to remote host: {}:{}\nErr: {}",
format!("{}:{}", remote_host, remote_port), remote_host, remote_port, e
e
) )
.as_str(), .as_str(),
); );
@ -321,7 +320,7 @@ impl<H: HandlerCallbacks + std::marker::Sync + std::marker::Send + Clone + 'stat
} }
}; };
let _ = s.set_read_timeout(Some(Duration::from_millis(50))); let _ = s.set_read_timeout(Some(Duration::from_millis(50)));
return Ok(DataStreamType::RAW(s)); Ok(DataStreamType::RAW(s))
} }
TCPDataType::TLS => { TCPDataType::TLS => {
let mut sslbuilder = SslConnector::builder(SslMethod::tls()).unwrap(); let mut sslbuilder = SslConnector::builder(SslMethod::tls()).unwrap();
@ -334,9 +333,8 @@ impl<H: HandlerCallbacks + std::marker::Sync + std::marker::Send + Clone + 'stat
Err(e) => { Err(e) => {
Self::handle_error( Self::handle_error(
format!( format!(
"Can't connect to remote host: {}\nErr: {}", "Can't connect to remote host: {}:{}\nErr: {}",
format!("{}:{}", remote_host, remote_port), remote_host, remote_port, e
e
) )
.as_str(), .as_str(),
); );
@ -357,7 +355,7 @@ impl<H: HandlerCallbacks + std::marker::Sync + std::marker::Send + Clone + 'stat
let _ = s let _ = s
.get_ref() .get_ref()
.set_read_timeout(Some(Duration::from_millis(50))); .set_read_timeout(Some(Duration::from_millis(50)));
return Ok(DataStreamType::TLS(s)); Ok(DataStreamType::TLS(s))
} }
} }
} }