mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-26 05:56:50 +00:00
fix(site-replication): preserve HTTPS peer join endpoints (#5045)
fix(site-replication): enhance TLS handling for peer joins and add tests
This commit is contained in:
@@ -21,8 +21,8 @@ use crate::admin::runtime_sources::{
|
|||||||
current_token_signing_key, object_store_from_req,
|
current_token_signing_key, object_store_from_req,
|
||||||
};
|
};
|
||||||
use crate::admin::site_replication_identity::{
|
use crate::admin::site_replication_identity::{
|
||||||
canonical_endpoint, deployment_id_for_endpoint, mark_unknown_peer_sync_enabled, normalize_peer_map_by_identity_with,
|
canonical_endpoint, deployment_id_for_endpoint, is_https_endpoint, mark_unknown_peer_sync_enabled,
|
||||||
same_identity_endpoint, site_identity_key,
|
normalize_peer_map_by_identity_with, same_identity_endpoint, site_identity_key,
|
||||||
};
|
};
|
||||||
use crate::admin::storage_api::bucket::metadata::{
|
use crate::admin::storage_api::bucket::metadata::{
|
||||||
BUCKET_CORS_CONFIG, BUCKET_LIFECYCLE_CONFIG, BUCKET_POLICY_CONFIG, BUCKET_QUOTA_CONFIG_FILE, BUCKET_REPLICATION_CONFIG,
|
BUCKET_CORS_CONFIG, BUCKET_LIFECYCLE_CONFIG, BUCKET_POLICY_CONFIG, BUCKET_QUOTA_CONFIG_FILE, BUCKET_REPLICATION_CONFIG,
|
||||||
@@ -2167,7 +2167,9 @@ fn build_join_peers(
|
|||||||
if let Some(local_site) = sites
|
if let Some(local_site) = sites
|
||||||
.iter()
|
.iter()
|
||||||
.find(|site| same_identity_endpoint(&site.endpoint, &normalized_local.endpoint))
|
.find(|site| same_identity_endpoint(&site.endpoint, &normalized_local.endpoint))
|
||||||
|
&& (is_https_endpoint(&local_site.endpoint) || !is_https_endpoint(&normalized_local.endpoint))
|
||||||
{
|
{
|
||||||
|
normalized_local.endpoint = local_site.endpoint.clone();
|
||||||
normalized_local.skip_tls_verify = local_site.skip_tls_verify;
|
normalized_local.skip_tls_verify = local_site.skip_tls_verify;
|
||||||
normalized_local.ca_cert_pem = local_site.ca_cert_pem.clone();
|
normalized_local.ca_cert_pem = local_site.ca_cert_pem.clone();
|
||||||
}
|
}
|
||||||
@@ -8154,6 +8156,66 @@ mod tests {
|
|||||||
assert_eq!(local.ca_cert_pem, "local-ca");
|
assert_eq!(local.ca_cert_pem, "local-ca");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_build_join_peers_prefers_explicit_https_for_all_local_peer_tls_modes() {
|
||||||
|
let local_peer = PeerInfo {
|
||||||
|
deployment_id: "local-deployment".to_string(),
|
||||||
|
..peer("local", "http://local.example.com:9000")
|
||||||
|
};
|
||||||
|
let custom_ca = valid_test_ca_pem("local.example.com");
|
||||||
|
|
||||||
|
for (skip_tls_verify, ca_cert_pem) in [(false, String::new()), (true, String::new()), (false, custom_ca)] {
|
||||||
|
let peers = build_join_peers(
|
||||||
|
&SiteReplicationState::default(),
|
||||||
|
&local_peer,
|
||||||
|
vec![PeerSite {
|
||||||
|
name: "local".to_string(),
|
||||||
|
endpoint: "https://local.example.com:9000".to_string(),
|
||||||
|
skip_tls_verify,
|
||||||
|
ca_cert_pem: ca_cert_pem.clone(),
|
||||||
|
..PeerSite::default()
|
||||||
|
}],
|
||||||
|
false,
|
||||||
|
);
|
||||||
|
|
||||||
|
let local = peers.get("local-deployment").expect("local peer should be present");
|
||||||
|
assert_eq!(local.endpoint, "https://local.example.com:9000");
|
||||||
|
assert_eq!(local.skip_tls_verify, skip_tls_verify);
|
||||||
|
assert_eq!(local.ca_cert_pem, ca_cert_pem);
|
||||||
|
assert!(validate_join_peer_snapshot(&peers).is_ok());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_build_join_peers_does_not_downgrade_local_https_tls_modes() {
|
||||||
|
let custom_ca = valid_test_ca_pem("local.example.com");
|
||||||
|
|
||||||
|
for (skip_tls_verify, ca_cert_pem) in [(false, String::new()), (true, String::new()), (false, custom_ca)] {
|
||||||
|
let local_peer = PeerInfo {
|
||||||
|
deployment_id: "local-deployment".to_string(),
|
||||||
|
skip_tls_verify,
|
||||||
|
ca_cert_pem: ca_cert_pem.clone(),
|
||||||
|
..peer("local", "https://local.example.com:9000")
|
||||||
|
};
|
||||||
|
let peers = build_join_peers(
|
||||||
|
&SiteReplicationState::default(),
|
||||||
|
&local_peer,
|
||||||
|
vec![PeerSite {
|
||||||
|
name: "local".to_string(),
|
||||||
|
endpoint: "http://local.example.com:9000".to_string(),
|
||||||
|
..PeerSite::default()
|
||||||
|
}],
|
||||||
|
false,
|
||||||
|
);
|
||||||
|
|
||||||
|
let local = peers.get("local-deployment").expect("local peer should be present");
|
||||||
|
assert_eq!(local.endpoint, "https://local.example.com:9000");
|
||||||
|
assert_eq!(local.skip_tls_verify, skip_tls_verify);
|
||||||
|
assert_eq!(local.ca_cert_pem, ca_cert_pem);
|
||||||
|
assert!(validate_join_peer_snapshot(&peers).is_ok());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_build_join_peers_explicitly_disables_existing_remote_tls_settings() {
|
fn test_build_join_peers_explicitly_disables_existing_remote_tls_settings() {
|
||||||
let local_peer = PeerInfo {
|
let local_peer = PeerInfo {
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ pub(crate) fn mark_unknown_peer_sync_enabled(peers: &mut BTreeMap<String, PeerIn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_https_endpoint(endpoint: &str) -> bool {
|
pub(super) fn is_https_endpoint(endpoint: &str) -> bool {
|
||||||
canonical_endpoint(endpoint).starts_with("https://")
|
canonical_endpoint(endpoint).starts_with("https://")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user