Server: load certificate chains
This commit is contained in:
parent
28d623fc3d
commit
1af09f72e9
2 changed files with 37 additions and 23 deletions
|
|
@ -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<String> = new_cert
|
||||
.subject_name()
|
||||
.entries()
|
||||
|
|
|
|||
|
|
@ -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<u8>) 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();
|
||||
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(
|
||||
|
||||
chain.push(CertificateDer::from_slice(Box::leak(
|
||||
data.to_vec().into_boxed_slice(),
|
||||
))],
|
||||
key,
|
||||
);
|
||||
)));
|
||||
|
||||
if !cert.is_ca() {
|
||||
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:?}"),
|
||||
|
|
|
|||
Loading…
Reference in a new issue