mirror of
git://git.proxmox.com/git/proxmox-websocket-tunnel.git
synced 2025-03-13 00:58:38 +03:00
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:
parent
c18e63b96f
commit
838b8aafca
49
src/main.rs
49
src/main.rs
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user