我正在用 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 可以在每个服务器上跟踪多个密钥,而不需要任何唯一性要求。
- <其他客户?>