@@ -2,12 +2,11 @@ use std::io;
2
2
use std:: sync:: Arc ;
3
3
4
4
use serde:: Deserialize ;
5
- use rustls:: server:: { ServerSessionMemoryCache , ServerConfig , WebPkiClientVerifier } ;
6
5
use tokio:: io:: { AsyncRead , AsyncWrite } ;
7
- use tokio_rustls:: TlsAcceptor ;
6
+ use tokio_rustls:: LazyConfigAcceptor ;
7
+ use rustls:: server:: { Acceptor , ServerConfig } ;
8
8
9
- use crate :: tls:: { TlsConfig , Error } ;
10
- use crate :: tls:: util:: { load_cert_chain, load_key, load_ca_certs} ;
9
+ use crate :: tls:: { Error , Resolver , TlsConfig } ;
11
10
use crate :: listener:: { Listener , Bindable , Connection , Certificates , Endpoint } ;
12
11
13
12
#[ doc( inline) ]
@@ -16,7 +15,8 @@ pub use tokio_rustls::server::TlsStream;
16
15
/// A TLS listener over some listener interface L.
17
16
pub struct TlsListener < L > {
18
17
listener : L ,
19
- acceptor : TlsAcceptor ,
18
+ resolver : Option < Box < dyn Resolver > > ,
19
+ default : Arc < ServerConfig > ,
20
20
config : TlsConfig ,
21
21
}
22
22
@@ -27,48 +27,6 @@ pub struct TlsBindable<I> {
27
27
pub tls : TlsConfig ,
28
28
}
29
29
30
- impl TlsConfig {
31
- pub ( crate ) fn server_config ( & self ) -> Result < ServerConfig , Error > {
32
- let provider = rustls:: crypto:: CryptoProvider {
33
- cipher_suites : self . ciphers ( ) . map ( |c| c. into ( ) ) . collect ( ) ,
34
- ..rustls:: crypto:: ring:: default_provider ( )
35
- } ;
36
-
37
- #[ cfg( feature = "mtls" ) ]
38
- let verifier = match self . mutual {
39
- Some ( ref mtls) => {
40
- let ca_certs = load_ca_certs ( & mut mtls. ca_certs_reader ( ) ?) ?;
41
- let verifier = WebPkiClientVerifier :: builder ( Arc :: new ( ca_certs) ) ;
42
- match mtls. mandatory {
43
- true => verifier. build ( ) ?,
44
- false => verifier. allow_unauthenticated ( ) . build ( ) ?,
45
- }
46
- } ,
47
- None => WebPkiClientVerifier :: no_client_auth ( ) ,
48
- } ;
49
-
50
- #[ cfg( not( feature = "mtls" ) ) ]
51
- let verifier = WebPkiClientVerifier :: no_client_auth ( ) ;
52
-
53
- let key = load_key ( & mut self . key_reader ( ) ?) ?;
54
- let cert_chain = load_cert_chain ( & mut self . certs_reader ( ) ?) ?;
55
- let mut tls_config = ServerConfig :: builder_with_provider ( Arc :: new ( provider) )
56
- . with_safe_default_protocol_versions ( ) ?
57
- . with_client_cert_verifier ( verifier)
58
- . with_single_cert ( cert_chain, key) ?;
59
-
60
- tls_config. ignore_client_order = self . prefer_server_cipher_order ;
61
- tls_config. session_storage = ServerSessionMemoryCache :: new ( 1024 ) ;
62
- tls_config. ticketer = rustls:: crypto:: ring:: Ticketer :: new ( ) ?;
63
- tls_config. alpn_protocols = vec ! [ b"http/1.1" . to_vec( ) ] ;
64
- if cfg ! ( feature = "http2" ) {
65
- tls_config. alpn_protocols . insert ( 0 , b"h2" . to_vec ( ) ) ;
66
- }
67
-
68
- Ok ( tls_config)
69
- }
70
- }
71
-
72
30
impl < I : Bindable > Bindable for TlsBindable < I >
73
31
where I :: Listener : Listener < Accept = <I :: Listener as Listener >:: Connection > ,
74
32
<I :: Listener as Listener >:: Connection : AsyncRead + AsyncWrite
@@ -79,7 +37,8 @@ impl<I: Bindable> Bindable for TlsBindable<I>
79
37
80
38
async fn bind ( self ) -> Result < Self :: Listener , Self :: Error > {
81
39
Ok ( TlsListener {
82
- acceptor : TlsAcceptor :: from ( Arc :: new ( self . tls . server_config ( ) ?) ) ,
40
+ default : Arc :: new ( self . tls . to_server_config ( ) ?) ,
41
+ resolver : None ,
83
42
listener : self . inner . bind ( ) . await . map_err ( |e| Error :: Bind ( Box :: new ( e) ) ) ?,
84
43
config : self . tls ,
85
44
} )
@@ -104,7 +63,15 @@ impl<L> Listener for TlsListener<L>
104
63
}
105
64
106
65
async fn connect ( & self , conn : L :: Connection ) -> io:: Result < Self :: Connection > {
107
- self . acceptor . accept ( conn) . await
66
+ let acceptor = LazyConfigAcceptor :: new ( Acceptor :: default ( ) , conn) ;
67
+ let handshake = acceptor. await ?;
68
+ let hello = handshake. client_hello ( ) ;
69
+ let config = match & self . resolver {
70
+ Some ( r) => r. resolve ( hello) . await . unwrap_or_else ( || self . default . clone ( ) ) ,
71
+ None => self . default . clone ( ) ,
72
+ } ;
73
+
74
+ handshake. into_stream ( config) . await
108
75
}
109
76
110
77
fn endpoint ( & self ) -> io:: Result < Endpoint > {
0 commit comments