33use std:: {
44 env,
55 fs:: { self , create_dir, File } ,
6- io:: { BufRead , BufReader } ,
6+ io:: { BufRead , BufReader , Write } ,
77 path:: { Path , PathBuf } ,
88 process:: { Child , Command , ExitStatus } ,
99 time:: { Duration , Instant } ,
@@ -22,6 +22,11 @@ use openssl::{
2222
2323use fdo_util:: servers:: format_conf_env;
2424
25+ use openssl:: rsa:: Rsa ;
26+ use openssl:: x509:: extension:: SubjectAlternativeName ;
27+ use openssl:: x509:: X509Extension ;
28+ use openssl:: x509:: X509ReqBuilder ;
29+
2530const PORT_BASE : u16 = 5080 ;
2631
2732lazy_static:: lazy_static! {
@@ -241,6 +246,9 @@ impl TestContext {
241246 } ;
242247
243248 new_context. create_keys ( ) . context ( "Error creating keys" ) ?;
249+ new_context
250+ . generate_https_keys_and_certs ( )
251+ . context ( "Error creating https key & cert" ) ?;
244252
245253 Ok ( new_context)
246254 }
@@ -259,6 +267,98 @@ impl TestContext {
259267 pub fn runner_path ( & self , number : & TestBinaryNumber ) -> PathBuf {
260268 self . testpath . join ( number. name ( ) )
261269 }
270+ pub fn generate_https_keys_and_certs ( & self ) -> Result < ( ) > {
271+ let https_keys_path = self . keys_path ( ) ;
272+ // create_dir(&https_keys_path).context("Error creating HTTPS keys directory")?;
273+
274+ /* // Generate RSA private key
275+ let rsa = Rsa::generate(2048).context("Error generating RSA private key")?;
276+ let private_key = PKey::from_rsa(rsa).context("Error converting RSA private key to PKey")?;
277+
278+ // Generate certificate request
279+ let mut req_builder = X509ReqBuilder::new().context("Error creating X509ReqBuilder")?;
280+ req_builder.set_pubkey(&private_key).context("Error setting public key in request")?;
281+ req_builder
282+ .add_extension(
283+ X509Extension::subject_alt_name(
284+ &SubjectAlternativeName::new()
285+ .dns("localhost")
286+ .dns("example.com"),
287+ )
288+ .context("Error adding Subject Alternative Name extension")?,
289+ )
290+ .context("Error adding extension to request")?;
291+ let req = req_builder.build();
292+
293+ // Sign the certificate request with the private key
294+ let cert = req
295+ .sign(&private_key, MessageDigest::sha256())
296+ .context("Error signing certificate request")?;
297+
298+ // Now serialize the key and certificate
299+ let private_key = private_key
300+ .private_key_to_der()
301+ .context("Error converting private key to DER")?;
302+ let cert = cert.to_pem().context("Error converting certificate to PEM")?;
303+
304+ // Write them to disk
305+ fs::write(https_keys_path.join("server_key.der"), private_key)
306+ .context("Error writing private key")?;
307+ fs::write(https_keys_path.join("server_cert.pem"), cert)
308+ .context("Error writing certificate")?; */
309+
310+ // Generate RSA private key
311+ let rsa = Rsa :: generate ( 2048 ) ?;
312+ //let private_key = rsa.private_key_to_pem()?;
313+ let private_key =
314+ PKey :: from_rsa ( rsa) . context ( "Error converting RSA private key to PKey" ) ?;
315+
316+ // Write private key to server.key file
317+ let mut key_file = File :: create ( format ! (
318+ "{}/manufacturing_server_https_key.key" ,
319+ https_keys_path. display( )
320+ ) ) ?;
321+ //key_file.write_all(&private_key)?;
322+ key_file. write_all ( & private_key. private_key_to_pem_pkcs8 ( ) ?) ?;
323+ // Generate X.509 certificate
324+ let mut builder = X509Builder :: new ( ) ?;
325+
326+ // Set subject for the certificate
327+ let mut name_builder = X509NameBuilder :: new ( ) ?;
328+ name_builder. append_entry_by_nid ( openssl:: nid:: Nid :: COMMONNAME , "localhost" ) ?;
329+ let subject_name = name_builder. build ( ) ;
330+ builder. set_subject_name ( & subject_name) ?;
331+
332+ // Set issuer same as subject (self-signed certificate)
333+ builder. set_issuer_name ( & subject_name) ?;
334+
335+ // Set public key in the certificate
336+ builder. set_pubkey ( & private_key) ?;
337+
338+ // Set validity period of the certificate (365 days)
339+ // let not_after = chrono::Utc::now() + chrono::Duration::days(365);
340+ //builder.set_not_after(¬_after)?;
341+ //builder.set_not_before(&chrono::Utc::now())?;
342+
343+ // let not_after = chrono::Utc::now() + chrono::Duration::days(365);
344+ // builder.set_not_after(Asn1Time::from(¬_after)?)?;
345+ builder. set_not_after ( Asn1Time :: days_from_now ( 365 ) ?. as_ref ( ) ) ?;
346+ builder. set_not_before ( Asn1Time :: days_from_now ( 0 ) ?. as_ref ( ) ) ?;
347+ // builder.set_not_before(Asn1Time::from(&chrono::Utc::now())?)?;
348+
349+ // Sign the certificate with the private key
350+ builder. sign ( & private_key, openssl:: hash:: MessageDigest :: sha256 ( ) ) ?;
351+ let certificate = builder. build ( ) ;
352+
353+ // Write certificate to server.crt file
354+ let mut cert_file = File :: create ( format ! (
355+ "{}/manufacturing_server_https_cert.crt" ,
356+ https_keys_path. display( )
357+ ) ) ?;
358+ cert_file. write_all ( & certificate. to_pem ( ) ?) ?;
359+
360+ Ok ( ( ) )
361+ }
262362
263363 fn create_keys ( & self ) -> Result < ( ) > {
264364 let keys_path = self . keys_path ( ) ;
@@ -336,7 +436,6 @@ impl TestContext {
336436 fs:: write ( keys_path. join ( format ! ( "{}_cert.pem" , key_name) ) , cert)
337437 . context ( "Error writing certificate" ) ?;
338438 }
339-
340439 Ok ( ( ) )
341440 }
342441
@@ -801,6 +900,7 @@ impl<'a> TestServerConfigurator<'a> {
801900 "bind" ,
802901 & format ! ( "127.0.0.1:{}" , self . server_number. server_port( ) . unwrap( ) ) ,
803902 ) ;
903+ cfg. insert ( "bind_https" , & format ! ( "127.0.0.1:{}" , 6000 ) ) ;
804904 cfg. insert ( "test_dir" , & self . test_context . testpath ( ) ) ;
805905 cfg. insert ( "owner_port" , & self . server_number . server_port ( ) . unwrap ( ) ) ;
806906 cfg. insert (
0 commit comments