| 73 | |
| 74 | #[actix_web::main] |
| 75 | async fn main() -> std::io::Result<()> { |
| 76 | env_logger::init_from_env(env_logger::Env::new().default_filter_or("info")); |
| 77 | |
| 78 | rustls::crypto::aws_lc_rs::default_provider() |
| 79 | .install_default() |
| 80 | .unwrap(); |
| 81 | |
| 82 | let mut cert_store = RootCertStore::empty(); |
| 83 | |
| 84 | // import CA cert |
| 85 | CertificateDer::pem_file_iter(CA_CERT) |
| 86 | .unwrap() |
| 87 | .flatten() |
| 88 | .for_each(|der| cert_store.add(der).unwrap()); |
| 89 | |
| 90 | // set up client authentication requirements |
| 91 | let client_auth = WebPkiClientVerifier::builder(Arc::new(cert_store)) |
| 92 | .build() |
| 93 | .unwrap(); |
| 94 | |
| 95 | // import server cert and key |
| 96 | let key_der = PrivateKeyDer::from_pem_file(SERVER_KEY).unwrap(); |
| 97 | let cert_chain = CertificateDer::pem_file_iter(SERVER_CERT) |
| 98 | .unwrap() |
| 99 | .flatten() |
| 100 | .collect(); |
| 101 | |
| 102 | let config = ServerConfig::builder() |
| 103 | .with_client_cert_verifier(client_auth) |
| 104 | .with_single_cert(cert_chain, key_der) |
| 105 | .unwrap(); |
| 106 | |
| 107 | log::info!("Starting HTTP server at http://localhost:8080 and https://localhost:8443"); |
| 108 | |
| 109 | HttpServer::new(|| { |
| 110 | App::new() |
| 111 | .default_service(web::to(route_whoami)) |
| 112 | .wrap(Logger::default()) |
| 113 | }) |
| 114 | .on_connect(get_client_cert) |
| 115 | .bind(("localhost", 8080))? |
| 116 | .bind_rustls_0_23(("localhost", 8443), config)? |
| 117 | .workers(2) |
| 118 | .run() |
| 119 | .await |
| 120 | } |