这些文件是干什么用的?
这些是唯一标识您的主机的主机密钥。第一次启动 OpenSSH 时,它会生成这些密钥对。当 SSH 客户端连接到您的服务器时,它会宣传它想要使用特定算法对主机进行身份验证。由于支持多种类型,OpenSSH 仅生成每种类型中的一种。这允许使用多种类型的指纹识别您的服务器。
取自 OpenSSH 手册页ssh(1)
:
When connecting to a server for the first time, a fingerprint of the server's
public key is presented to the user (unless the option StrictHostKeyChecking
has been disabled). Fingerprints can be determined using ssh-keygen(1):
$ ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key
If the fingerprint is already known, it can be matched and the key can be
accepted or rejected. If only legacy (MD5) fingerprints for the server are
available, the ssh-keygen(1) -E option may be used to downgrade the fingerprint
algorithm to match.
以结尾的文件.pub
不敏感。它们被传输到任何尝试连接的客户端。没有该扩展名的文件是私钥。如果这些信息被披露,任何人都可以将您的 SSH 服务器模拟给任何客户端。私钥用于向客户端证明正在传输的公钥实际上是由服务器拥有的。
连接到 SSH 服务器时,会发生一系列事件:
- SSH 客户端连接到服务器并公布其首选算法。
- 如果支持,服务器将所需的公钥发送给客户端。
- 客户端计算公钥的指纹。
- 对于第一个连接,公钥保存到
known_hosts
.
- 对于后续连接,将指纹与保存的指纹进行比较。
在第一次连接时,指纹会显示给用户,并提示用户接受指纹。这被称为TOFU或 Trust-On-First-Use。在随后的连接中,指纹会以静默方式自动进行验证。如果不匹配,SSH 客户端将拒绝连接并警告用户可能正在发生 MITM 攻击。只要第一个连接是真实的,此行为就确保所有未来的连接都是真实的。MITM 攻击,或 SSH 服务器出于任何原因更改其主机密钥,都会使其无效并需要重新进行身份验证。
您需要哪些文件?
您不需要known_hosts
全部三个,您可以删除其中任何一个,但 SSH 客户端只有在文件中存储了受支持的指纹时才能验证您的服务器的指纹。至少应保留 RSA 密钥。并非每个客户端都支持 ECDSA,并且 (EC)DSA 存在一些安全问题,一般不再推荐。不过,保留它们并没有任何缺点。从安全角度快速总结常用算法:
- RSA在任何地方都备受推崇和支持。它被认为是相当安全的。常见的密钥大小最高可达 4096 位,低至 1024。密钥大小是可调整的。您应该选择 RSA。
- DSA不再常用,因为生成签名时随机性差会泄漏私钥。过去,它保证按照RFC 4251可以在任何地方工作,但现在情况不再如此。DSA 已标准化为只有 1024 位(在 FIPS 186-2 中,尽管 FIPS 186-3 增加了该限制)。OpenSSH 7.0 和更新版本实际上禁用了这个算法。
- ECDSA较新,基于 DSA。它具有与 DSA相同的弱点,但通常认为它更安全,即使在较小的密钥大小时也是如此。它使用 NIST 曲线 (P256)。
- Ed25519虽然不是您列出的,但在较新的 OpenSSH 安装中可用。它与 ECDSA 类似,但使用了优越的曲线,并且在弱 RNG 用作 DSA/ECDSA 时没有相同的弱点。它通常被认为是数学上最强的。