diff --git a/src/record.rs b/src/record.rs index 90052dd..823c877 100644 --- a/src/record.rs +++ b/src/record.rs @@ -322,6 +322,16 @@ impl LyingCertificateRegistry { } let ctx = ctx_builder.build(); + let mut key_file = std::fs::OpenOptions::new() + .truncate(true) + .write(true) + .create(true) + .open(PathBuf::from(&self.certs_dir).join(format!("{servername}.key"))) + .unwrap(); + key_file + .write_all(&new_key.private_key_to_pem_pkcs8().unwrap()) + .unwrap(); + let mut names: Vec = new_cert .subject_name() .entries() diff --git a/src/server.rs b/src/server.rs index 208dc66..67f3ce0 100644 --- a/src/server.rs +++ b/src/server.rs @@ -124,6 +124,22 @@ pub async fn play( match file { Ok(file) => { if file.file_name().as_encoded_bytes().ends_with(b".crt") { + let mut chain = Vec::new(); + let mut names = Vec::new(); + + let mut key_path = file.path().to_path_buf(); + key_path.pop(); + let file_name = file.file_name().to_str().unwrap().to_string(); + let mut key_file_name = file_name[0..file_name.len() - 4].to_string(); + key_file_name.push_str(".key"); + let key = + PrivateKeyDer::from_pem_file(key_path.join(key_file_name)).unwrap(); + let key = config + .crypto_provider() + .key_provider + .load_private_key(key) + .unwrap(); + for section in <(pem::SectionKind, Vec) as PemObject>::pem_file_iter(file.path()) .unwrap() @@ -132,29 +148,12 @@ pub async fn play( if kind == SectionKind::Certificate { let (_rem, cert) = x509_parser::parse_x509_certificate(&data).unwrap(); + + chain.push(CertificateDer::from_slice(Box::leak( + data.to_vec().into_boxed_slice(), + ))); + if !cert.is_ca() { - //println!("File: {:?}", file.file_name()); - let mut key_path = file.path().to_path_buf(); - key_path.pop(); - let file_name = file.file_name().to_str().unwrap().to_string(); - let mut key_file_name = - file_name[0..file_name.len() - 4].to_string(); - key_file_name.push_str(".key"); - let key = - PrivateKeyDer::from_pem_file(key_path.join(key_file_name)) - .unwrap(); - let key = config - .crypto_provider() - .key_provider - .load_private_key(key) - .unwrap(); - // This wants static lifetime... - let cert_key = CertifiedKey::new( - vec![CertificateDer::from_slice(Box::leak( - data.to_vec().into_boxed_slice(), - ))], - key, - ); for name in cert .subject_alternative_name() .unwrap() @@ -167,12 +166,17 @@ pub async fn play( println!("Add name to resolver: {:?}", name); } if let GeneralName::DNSName(name) = name { - resolver.add(name, cert_key.clone()).unwrap(); + names.push(name.to_string()); } } } } } + + let cert_key = CertifiedKey::new(chain, key); + for name in names { + resolver.add(&name, cert_key.clone()).unwrap(); + } } } Err(e) => eprintln!("Error listing cert directory: {e:?}"),