aboutsummaryrefslogtreecommitdiff
path: root/src/certs.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-08-19 03:14:34 +0200
committermetamuffin <metamuffin@disroot.org>2024-08-19 03:14:34 +0200
commitd06821468e9a6e0d62c4b1ced21b1290e7a5bc47 (patch)
tree0ef2cade2bfb6a24f2bb3e65b074df81afd5b5dd /src/certs.rs
parent6c3524c381467483a025eda5e7e5f0ded53094fa (diff)
downloadgnix-d06821468e9a6e0d62c4b1ced21b1290e7a5bc47.tar
gnix-d06821468e9a6e0d62c4b1ced21b1290e7a5bc47.tar.bz2
gnix-d06821468e9a6e0d62c4b1ced21b1290e7a5bc47.tar.zst
fallback cert
Diffstat (limited to 'src/certs.rs')
-rw-r--r--src/certs.rs24
1 files changed, 22 insertions, 2 deletions
diff --git a/src/certs.rs b/src/certs.rs
index 27aab51..84d0fca 100644
--- a/src/certs.rs
+++ b/src/certs.rs
@@ -19,6 +19,7 @@ use webpki::EndEntityCert;
pub struct CertPool {
provider: &'static Arc<CryptoProvider>,
domains: HashMap<String, Arc<CertifiedKey>>,
+ fallback: Option<Arc<CertifiedKey>>,
}
impl Default for CertPool {
@@ -26,16 +27,30 @@ impl Default for CertPool {
Self {
provider: CryptoProvider::get_default().unwrap(),
domains: Default::default(),
+ fallback: None,
}
}
}
impl CertPool {
- pub fn load(roots: &[PathBuf]) -> Result<Self> {
+ pub fn load(roots: &[PathBuf], fallback: Option<PathBuf>) -> Result<Self> {
let mut s = Self::default();
for r in roots {
s.load_recursive(&r)?;
}
+ if let Some(path) = fallback {
+ let keypath = path.join("privkey.pem");
+ let certpath = if path.join("fullchain.pem").exists() {
+ path.join("fullchain.pem")
+ } else {
+ path.join("cert.pem")
+ };
+ let certs = load_certs(&certpath)?;
+ let key = load_private_key(&keypath)?;
+ let skey = s.provider.key_provider.load_private_key(key)?;
+ let ck = CertifiedKey::new(certs.clone(), skey.clone());
+ s.fallback = Some(Arc::new(ck))
+ }
Ok(s)
}
@@ -74,7 +89,12 @@ impl CertPool {
impl ResolvesServerCert for CertPool {
fn resolve(&self, client_hello: ClientHello<'_>) -> Option<Arc<CertifiedKey>> {
- Some(self.domains.get(client_hello.server_name()?)?.clone())
+ Some(
+ self.domains
+ .get(client_hello.server_name()?)
+ .or(self.fallback.as_ref())?
+ .clone(),
+ )
}
}