1
1
use std:: io;
2
- use std:: path:: Path ;
3
2
use std:: pin:: Pin ;
4
3
use std:: sync:: Arc ;
5
4
use std:: task:: { Context , Poll } ;
@@ -8,12 +7,14 @@ use anyhow::{Context as _, Result};
8
7
use fs_err as fs;
9
8
use rustls:: pki_types:: pem:: PemObject ;
10
9
use rustls:: pki_types:: { CertificateDer , PrivateKeyDer } ;
10
+ use rustls:: version:: { TLS12 , TLS13 } ;
11
11
use tokio:: io:: { AsyncRead , AsyncWrite , ReadBuf } ;
12
12
use tokio:: net:: TcpStream ;
13
13
use tokio:: time:: timeout;
14
14
use tokio_rustls:: { rustls, TlsAcceptor } ;
15
15
use tracing:: debug;
16
16
17
+ use crate :: config:: { CryptoProvider , ProxyConfig , TlsVersion } ;
17
18
use crate :: main_service:: Proxy ;
18
19
19
20
use super :: io_bridge:: bridge;
@@ -91,25 +92,43 @@ pub struct TlsTerminateProxy {
91
92
acceptor : TlsAcceptor ,
92
93
}
93
94
94
- impl TlsTerminateProxy {
95
- pub fn new ( app_state : & Proxy , cert : impl AsRef < Path > , key : impl AsRef < Path > ) -> Result < Self > {
96
- let cert_pem = fs:: read ( cert. as_ref ( ) ) . context ( "failed to read certificate" ) ?;
97
- let key_pem = fs:: read ( key. as_ref ( ) ) . context ( "failed to read private key" ) ?;
98
- let certs = CertificateDer :: pem_slice_iter ( cert_pem. as_slice ( ) )
99
- . collect :: < Result < Vec < _ > , _ > > ( )
100
- . context ( "failed to parse certificate" ) ?;
101
- let key = PrivateKeyDer :: from_pem_slice ( key_pem. as_slice ( ) )
102
- . context ( "failed to parse private key" ) ?;
95
+ fn create_acceptor ( config : & ProxyConfig ) -> Result < TlsAcceptor > {
96
+ let cert_pem = fs:: read ( & config. cert_chain ) . context ( "failed to read certificate" ) ?;
97
+ let key_pem = fs:: read ( & config. cert_key ) . context ( "failed to read private key" ) ?;
98
+ let certs = CertificateDer :: pem_slice_iter ( cert_pem. as_slice ( ) )
99
+ . collect :: < Result < Vec < _ > , _ > > ( )
100
+ . context ( "failed to parse certificate" ) ?;
101
+ let key =
102
+ PrivateKeyDer :: from_pem_slice ( key_pem. as_slice ( ) ) . context ( "failed to parse private key" ) ?;
103
+
104
+ let provider = match config. tls_crypto_provider {
105
+ CryptoProvider :: AwsLcRs => rustls:: crypto:: aws_lc_rs:: default_provider ( ) ,
106
+ CryptoProvider :: Ring => rustls:: crypto:: ring:: default_provider ( ) ,
107
+ } ;
108
+ let supported_versions = config
109
+ . tls_versions
110
+ . iter ( )
111
+ . map ( |v| match v {
112
+ TlsVersion :: Tls12 => & TLS12 ,
113
+ TlsVersion :: Tls13 => & TLS13 ,
114
+ } )
115
+ . collect :: < Vec < _ > > ( ) ;
116
+ let config = rustls:: ServerConfig :: builder_with_provider ( Arc :: new ( provider) )
117
+ . with_protocol_versions ( & supported_versions)
118
+ . context ( "Failed to build TLS config" ) ?
119
+ . with_no_client_auth ( )
120
+ . with_single_cert ( certs, key) ?;
103
121
104
- let config = rustls:: ServerConfig :: builder ( )
105
- . with_no_client_auth ( )
106
- . with_single_cert ( certs, key) ?;
122
+ let acceptor = TlsAcceptor :: from ( Arc :: new ( config) ) ;
107
123
108
- let acceptor = TlsAcceptor :: from ( Arc :: new ( config) ) ;
124
+ Ok ( acceptor)
125
+ }
109
126
127
+ impl TlsTerminateProxy {
128
+ pub fn new ( app_state : & Proxy ) -> Result < Self > {
110
129
Ok ( Self {
111
130
app_state : app_state. clone ( ) ,
112
- acceptor,
131
+ acceptor : create_acceptor ( & app_state . config . proxy ) ? ,
113
132
} )
114
133
}
115
134
0 commit comments