Skip to content

Commit b336964

Browse files
authored
feat(dgw): TLS thumbprint anchoring (#1570)
Allow "unsecure" TLS if the client provides a thumbprint and the peer certificate matches it. Issue: DGW-318
1 parent 633d09d commit b336964

File tree

18 files changed

+791
-12
lines changed

18 files changed

+791
-12
lines changed

Cargo.lock

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

devolutions-gateway/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ zeroize = { version = "1.8", features = ["derive"] }
7575
multibase = "0.9"
7676
argon2 = { version = "0.5", features = ["std"] }
7777
x509-cert = { version = "0.2", default-features = false, features = ["std"] }
78+
sha2 = "0.10"
79+
hex = "0.4"
80+
rustls-native-certs = "0.8"
7881

7982
# Logging
8083
tracing = "0.1"

devolutions-gateway/src/api/fwd.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -243,12 +243,12 @@ where
243243
if with_tls {
244244
trace!("Establishing TLS connection with server");
245245

246-
// Establish TLS connection with server
247-
248-
let server_stream = crate::tls::connect(selected_target.host().to_owned(), server_stream)
249-
.await
250-
.context("TLS connect")
251-
.map_err(ForwardError::BadGateway)?;
246+
// Establish TLS connection with server.
247+
let server_stream =
248+
crate::tls::safe_connect(selected_target.host().to_owned(), server_stream, claims.cert_thumb256)
249+
.await
250+
.context("TLS connect")
251+
.map_err(ForwardError::BadGateway)?;
252252

253253
info!("WebSocket-TLS forwarding");
254254

devolutions-gateway/src/api/webapp.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,7 @@ pub(crate) async fn sign_session_token(
339339
jet_reuse: ReconnectionPolicy::Disallowed,
340340
exp,
341341
jti,
342+
cert_thumb256: None,
342343
}
343344
.pipe(serde_json::to_value)
344345
.map(|mut claims| {

devolutions-gateway/src/rd_clean_path.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ async fn process_cleanpath(
256256

257257
// Establish TLS connection with server
258258

259-
let server_stream = crate::tls::connect(selected_target.host().to_owned(), server_stream)
259+
let server_stream = crate::tls::dangerous_connect(selected_target.host().to_owned(), server_stream)
260260
.await
261261
.map_err(|source| CleanPathError::TlsHandshake {
262262
source,

devolutions-gateway/src/rdp_proxy.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ where
8787
// -- Perform the TLS upgrading for both the client and the server, effectively acting as a man-in-the-middle -- //
8888

8989
let client_tls_upgrade_fut = tls_conf.acceptor.accept(client_stream);
90-
let server_tls_upgrade_fut = crate::tls::connect(server_dns_name.clone(), server_stream);
90+
let server_tls_upgrade_fut = crate::tls::dangerous_connect(server_dns_name.clone(), server_stream);
9191

9292
let (client_stream, server_stream) = tokio::join!(client_tls_upgrade_fut, server_tls_upgrade_fut);
9393

@@ -510,7 +510,7 @@ async fn get_cached_gateway_public_key(
510510
async fn retrieve_gateway_public_key(hostname: String, acceptor: tokio_rustls::TlsAcceptor) -> anyhow::Result<Vec<u8>> {
511511
let (client_side, server_side) = tokio::io::duplex(4096);
512512

513-
let connect_fut = crate::tls::connect(hostname, client_side);
513+
let connect_fut = crate::tls::dangerous_connect(hostname, client_side);
514514
let accept_fut = acceptor.accept(server_side);
515515

516516
let (connect_res, _) = tokio::join!(connect_fut, accept_fut);

0 commit comments

Comments
 (0)