Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ to docs, or any other relevant information.
## [Unreleased]

### Added
* Support for dynamic client certificate resolution via `TlsOptions::client_cert_resolver`, which
accepts an `Arc<dyn ResolvesClientCert>` for per-handshake mTLS certificate selection. This enables
transparent certificate rotation without process restarts — useful for short-lived certificates
managed by Vault, cert-manager, or HSM-backed signers. `ResolvesClientCert`, `CertifiedKey`, and
`SignatureScheme` are re-exported from the crate root for convenience.
* `client()` and `workflow_handle()` helpers to `ActivityContext` for easily obtaining a Temporal client
* Exposed `backoff_start_interval` when continuing as new, which will delay the first task of the
continued workflow by the configured interval.
Expand Down
1 change: 1 addition & 0 deletions crates/client/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ tokio = { version = "1.47", default-features = false, features = [
] }
tonic = { workspace = true, default-features = false, features = ["tls-native-roots", "channel", "gzip"] }
tokio-rustls = { version = "0.26", default-features = false }
rustls-native-certs = "0.8"
Comment thread
brucearctor marked this conversation as resolved.
Outdated
tower = { version = "0.5", features = ["util"] }
tracing = "0.1"
url = "2.5"
Expand Down
13 changes: 12 additions & 1 deletion crates/client/src/dns.rs
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,18 @@ async fn build_endpoint(
patched
}
});
let channel = add_tls_to_channel(tls_for_ip.as_ref().or(tls_options), channel).await?;
let tls_result = add_tls_to_channel(tls_for_ip.as_ref().or(tls_options), channel).await?;

let channel = match tls_result {
crate::TlsConfigResult::Standard(ep) => ep,
crate::TlsConfigResult::CustomConnector { .. } => {
return Err(ClientConnectError::InvalidConfig(
"client_cert_resolver is not yet supported with dns_load_balancing. \
Disable dns_load_balancing or use static client_tls_options instead."
.to_owned(),
));
}
};

let channel = if let Some(keep_alive) = keep_alive {
channel
Expand Down
1 change: 1 addition & 0 deletions crates/client/src/envconfig.rs
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ fn build_tls_options(tls: ClientConfigTLS) -> Result<TlsOptions, ConfigError> {
domain: tls.server_name,
client_tls_options,
server_cert_verifier: None,
client_cert_resolver: None,
})
}

Expand Down
Loading
Loading