我正在使用 Java 創建自動化 SFTP 用戶端,當然我需要保存每個伺服器的伺服器 SSH 指紋,但是伺服器是否可能有兩個或更多唯一的指紋?
是否有可能存在負載平衡 SFTP 服務,負載平衡器後面有多個 SSH 伺服器,每個伺服器都有唯一的指紋?還是因為某些原因迫使他們都使用相同的指紋?
答案1
是和不是。
單一伺服器可以有多個主機金鑰用於替代演算法(事實上最多伺服器支援例如 RSA + EdDSA),但每個連線僅選擇一個主機金鑰,對於客戶端來說,只記住一個就足夠了。
在負載平衡服務的情況下,沒有神奇的機制可以力量所有節點共享相同的金鑰。但在實踐中,系統管理員很可能只是在所有節點上複製相同的金鑰對,以使用戶更容易連接。
更詳細地說:
首先,即使是一個單身的伺服器始終可以擁有多個具有不同演算法的主機金鑰 - 例如:一個 ssh-rsa 金鑰、一個 ssh-ed25519 金鑰和一個 ecdsa-nistp256 金鑰。
握手要求客戶端選擇一把金鑰,通常只記住這把鑰匙的指紋。但是,某些用戶端(例如 PuTTY)允許使用所有可用的主機金鑰重新產生連線金鑰,以支援演算法遷移。
例如,您使用伺服器的 ssh-rsa 金鑰進行連接,但另外記住其 ssh-ed25519 指紋。稍後,如果伺服器停用 ssh-rsa 支持,您現在可以使用 ssh-ed25519,而無需重新提示使用者。
連接到負載平衡服務時,某些用戶端將允許多個已知主機金鑰即使是同一類型需手動批准。
例如,如果多個節點共用相同的主機名,OpenSSH 用戶端允許您手動將其所有公鑰新增至 ~/.ssh/known_hosts 並接受任何符合的條目。
然而,OpenSSH 不會這樣做自動地– 一旦它知道第一個密鑰,它將把任何更改視為致命錯誤。因此,在實踐中,我假設系統管理員實際上試圖避免不良的用戶體驗,只是將相同的主機金鑰克隆到所有負載平衡的節點。
現有客戶總結:
- PuTTY 可以追蹤每台伺服器的多個金鑰,但每種演算法只能追蹤一個。換句話說,它要求[主機名稱、連接埠、演算法]組合是唯一的。
- OpenSSH 可以追蹤每個伺服器的多個金鑰,沒有任何唯一性要求。
- <其他客戶?