@@ -26,12 +26,14 @@ use chrono::{DateTime, NaiveDateTime, Timelike, Utc};
26
26
use clokwerk:: { AsyncScheduler , Scheduler , TimeUnits } ;
27
27
use filetime:: FileTime ;
28
28
use log:: warn;
29
- use openssl:: ssl:: { SslAcceptor , SslFiletype , SslMethod } ;
29
+ use rustls:: { Certificate , PrivateKey , ServerConfig } ;
30
+ use rustls_pemfile:: { certs, pkcs8_private_keys} ;
30
31
use thread_priority:: { ThreadBuilder , ThreadPriority } ;
31
32
32
33
include ! ( concat!( env!( "OUT_DIR" ) , "/generated.rs" ) ) ;
33
34
34
- use std:: fs;
35
+ use std:: fs:: { self , File } ;
36
+ use std:: io:: BufReader ;
35
37
use std:: panic:: { catch_unwind, AssertUnwindSafe } ;
36
38
use std:: path:: Path ;
37
39
use std:: thread:: { self , JoinHandle } ;
@@ -274,19 +276,40 @@ async fn run_http() -> anyhow::Result<()> {
274
276
& CONFIG . parseable . tls_key_path ,
275
277
) {
276
278
( Some ( cert) , Some ( key) ) => {
277
- let mut builder = SslAcceptor :: mozilla_intermediate ( SslMethod :: tls ( ) ) ?;
278
- builder. set_private_key_file ( key, SslFiletype :: PEM ) ?;
279
- builder. set_certificate_chain_file ( cert) ?;
280
- Some ( builder)
279
+ // init server config builder with safe defaults
280
+ let config = ServerConfig :: builder ( )
281
+ . with_safe_defaults ( )
282
+ . with_no_client_auth ( ) ;
283
+
284
+ // load TLS key/cert files
285
+ let cert_file = & mut BufReader :: new ( File :: open ( cert) ?) ;
286
+ let key_file = & mut BufReader :: new ( File :: open ( key) ?) ;
287
+
288
+ // convert files to key/cert objects
289
+ let cert_chain = certs ( cert_file) ?. into_iter ( ) . map ( Certificate ) . collect ( ) ;
290
+
291
+ let mut keys: Vec < PrivateKey > = pkcs8_private_keys ( key_file) ?
292
+ . into_iter ( )
293
+ . map ( PrivateKey )
294
+ . collect ( ) ;
295
+
296
+ // exit if no keys could be parsed
297
+ if keys. is_empty ( ) {
298
+ anyhow:: bail!( "Could not locate PKCS 8 private keys." ) ;
299
+ }
300
+
301
+ let server_config = config. with_single_cert ( cert_chain, keys. remove ( 0 ) ) ?;
302
+
303
+ Some ( server_config)
281
304
}
282
305
( _, _) => None ,
283
306
} ;
284
307
285
308
// concurrent workers equal to number of cores on the cpu
286
309
let http_server = HttpServer :: new ( move || create_app ! ( ) ) . workers ( num_cpus:: get ( ) ) ;
287
- if let Some ( builder ) = ssl_acceptor {
310
+ if let Some ( config ) = ssl_acceptor {
288
311
http_server
289
- . bind_openssl ( & CONFIG . parseable . address , builder ) ?
312
+ . bind_rustls ( & CONFIG . parseable . address , config ) ?
290
313
. run ( )
291
314
. await ?;
292
315
} else {
0 commit comments