extern crate native_tls; use native_tls::{Identity, TlsAcceptor, TlsStream}; use std::fs::File; use std::io::{Read, Write}; use std::net::{TcpListener, TcpStream}; use std::sync::Arc; use std::thread; fn main() { let mut cert_file = File::open("test/cert.pem").unwrap(); let mut certs = vec![]; cert_file.read_to_end(&mut certs).unwrap(); let mut key_file = File::open("test/key.pem").unwrap(); let mut key = vec![]; key_file.read_to_end(&mut key).unwrap(); let pkcs8 = Identity::from_pkcs8(&certs, &key).unwrap(); let acceptor = TlsAcceptor::new(pkcs8).unwrap(); let acceptor = Arc::new(acceptor); let listener = TcpListener::bind("0.0.0.0:8443").unwrap(); fn handle_client(mut stream: TlsStream) { let mut buf = [0; 1024]; let read = stream.read(&mut buf).unwrap(); let received = std::str::from_utf8(&buf[0..read]).unwrap(); stream .write_all(format!("received '{}'", received).as_bytes()) .unwrap(); } for stream in listener.incoming() { match stream { Ok(stream) => { let acceptor = acceptor.clone(); thread::spawn(move || { let stream = acceptor.accept(stream).unwrap(); handle_client(stream); }); } Err(_e) => { /* connection failed */ } } } }