add fingerprint validation

in case we have no explicit fingerprint, we use openssl's regular "PEER"
verification. if we have a fingerprint, we ignore openssl verification
results altogether and just verify the fingerprint of the presented leaf
certificate, skipping the rest of the certificate chain (depth != 0).

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
This commit is contained in:
Fabian Grünbichler 2022-02-03 13:41:27 +01:00 committed by Thomas Lamprecht
parent c18e63b96f
commit 838b8aafca

View File

@ -134,9 +134,52 @@ impl CtrlTunnel {
} }
let mut ssl_connector_builder = SslConnector::builder(SslMethod::tls())?; let mut ssl_connector_builder = SslConnector::builder(SslMethod::tls())?;
if fingerprint.is_some() { if let Some(expected) = fingerprint {
// FIXME actually verify fingerprint via callback! ssl_connector_builder.set_verify_callback(
ssl_connector_builder.set_verify(openssl::ssl::SslVerifyMode::NONE); openssl::ssl::SslVerifyMode::PEER,
move |_valid, ctx| {
let cert = match ctx.current_cert() {
Some(cert) => cert,
None => {
// should not happen
eprintln!("SSL context lacks current certificate.");
return false;
}
};
// skip CA certificates, we only care about the peer cert
let depth = ctx.error_depth();
if depth != 0 {
return true;
}
let fp = match cert.digest(openssl::hash::MessageDigest::sha256()) {
Ok(fp) => fp,
Err(err) => {
// should not happen
eprintln!("failed to calculate certificate FP - {}", err);
return false;
}
};
let fp_string = hex::encode(&fp);
let fp_string = fp_string
.as_bytes()
.chunks(2)
.map(|v| std::str::from_utf8(v).unwrap())
.collect::<Vec<&str>>()
.join(":");
let expected = expected.to_lowercase();
if expected == fp_string {
true
} else {
eprintln!("certificate fingerprint does not match expected fingerprint!");
eprintln!("expected: {}", expected);
eprintln!("encountered: {}", fp_string);
false
}
},
);
} else { } else {
ssl_connector_builder.set_verify(openssl::ssl::SslVerifyMode::PEER); ssl_connector_builder.set_verify(openssl::ssl::SslVerifyMode::PEER);
} }