@@ -6,7 +6,7 @@ use std::{
66
77use rustls:: { ServerConfig , server:: Acceptor } ;
88use socket2:: { Domain , Socket , Type } ;
9- use tokio:: { io:: AsyncWriteExt , net:: TcpStream , sync:: watch} ;
9+ use tokio:: { io:: AsyncWriteExt , net:: TcpStream , sync:: watch, time } ;
1010use tokio_rustls:: { LazyConfigAcceptor , server:: TlsStream } ;
1111use tracing:: debug;
1212
@@ -26,6 +26,7 @@ pub use tcp_listener::TcpListener;
2626pub use tcp_tls_listener:: TcpAndTlsListener ;
2727
2828pub const GRACEFUL_SHUTDOWN_TIMEOUT : Duration = Duration :: from_secs ( 20 ) ;
29+ pub const TLS_HANDSHAKE_TIMEOUT : Duration = Duration :: from_secs ( 10 ) ;
2930
3031/// Listeners handle connections and dispatch HTTP requests to services
3132#[ async_trait:: async_trait]
@@ -116,37 +117,76 @@ async fn accept_tls_connection<IO: Unpin + tokio::io::AsyncRead + tokio::io::Asy
116117 listener_name : & str ,
117118 tls_server_config : Arc < ServerConfig > ,
118119) -> Result < Option < TlsStream < IO > > , ( ) > {
119- let tls_start_handshake = match LazyConfigAcceptor :: new ( Acceptor :: default ( ) , tcp_stream) . await {
120- Ok ( tls_start_handshake) => tls_start_handshake,
121- Err ( err) => {
122- debug ! ( listener = listener_name, client = ?client_socket_addr, "error accepting TLS connection: {err:?}" ) ;
123- return Err ( ( ) ) ;
124- }
125- } ;
120+ let tls_start_handshake =
121+ match time:: timeout ( TLS_HANDSHAKE_TIMEOUT , LazyConfigAcceptor :: new ( Acceptor :: default ( ) , tcp_stream) ) . await {
122+ Ok ( Ok ( tls_start_handshake) ) => tls_start_handshake,
123+ Ok ( Err ( err) ) => {
124+ debug ! (
125+ listener = listener_name,
126+ client = ?client_socket_addr,
127+ "error accepting TLS connection: {err:?}"
128+ ) ;
129+ return Err ( ( ) ) ;
130+ }
131+ Err ( err) => {
132+ debug ! (
133+ listener = listener_name,
134+ client = ?client_socket_addr,
135+ "TLS handshake timeout before ClientHello: {err:?}"
136+ ) ;
137+ return Err ( ( ) ) ;
138+ }
139+ } ;
126140
127141 let client_hello = tls_start_handshake. client_hello ( ) ;
128142
129143 // handle ACME tls-alpn-01 challenges
130144 if is_tls_alpn_challenge ( & client_hello) {
131145 let tls_config_acme = tls_manager. get_tls_alpn_01_server_config ( & client_hello) . await ;
132- let mut stream = match tls_start_handshake. into_stream ( tls_config_acme) . await {
133- Ok ( stream) => stream,
134- Err ( err) => {
135- debug ! ( listener = listener_name, client = ?client_socket_addr, "error converting TLS stream to TCP stream for ACME: {err:?}" ) ;
136- return Err ( ( ) ) ;
137- }
138- } ;
146+ let mut stream =
147+ match time:: timeout ( TLS_HANDSHAKE_TIMEOUT , tls_start_handshake. into_stream ( tls_config_acme) ) . await {
148+ Ok ( Ok ( stream) ) => stream,
149+ Ok ( Err ( err) ) => {
150+ debug ! (
151+ listener = listener_name,
152+ client = ?client_socket_addr,
153+ "error converting TLS stream to TCP stream for ACME: {err:?}"
154+ ) ;
155+ return Err ( ( ) ) ;
156+ }
157+ Err ( err) => {
158+ debug ! (
159+ listener = listener_name,
160+ client = ?client_socket_addr,
161+ "TLS handshake timeout during ACME: {err:?}"
162+ ) ;
163+ return Err ( ( ) ) ;
164+ }
165+ } ;
139166 let _ = stream. shutdown ( ) . await ;
140167 return Ok ( None ) ;
141168 }
142169
143- let tcp_stream = match tls_start_handshake. into_stream ( tls_server_config) . await {
144- Ok ( tcp_stream) => tcp_stream,
145- Err ( err) => {
146- debug ! ( listener = listener_name, client = ?client_socket_addr, "error converting TLS stream to TCP stream: {err:?}" ) ;
147- return Err ( ( ) ) ;
148- }
149- } ;
170+ let tcp_stream =
171+ match time:: timeout ( TLS_HANDSHAKE_TIMEOUT , tls_start_handshake. into_stream ( tls_server_config) ) . await {
172+ Ok ( Ok ( tcp_stream) ) => tcp_stream,
173+ Ok ( Err ( err) ) => {
174+ debug ! (
175+ listener = listener_name,
176+ client = ?client_socket_addr,
177+ "error converting TLS stream to TCP stream: {err:?}"
178+ ) ;
179+ return Err ( ( ) ) ;
180+ }
181+ Err ( err) => {
182+ debug ! (
183+ listener = listener_name,
184+ client = ?client_socket_addr,
185+ "TLS handshake timeout during server config: {err:?}"
186+ ) ;
187+ return Err ( ( ) ) ;
188+ }
189+ } ;
150190
151191 debug ! ( listener = listener_name, client = ?client_socket_addr, "TLS connection accepted" ) ;
152192
0 commit comments