SSH服务器指纹是在哪里生成/存储的?

我安装了openssh-server并使用ssh-keygen创建了一个密钥。然后,我尝试使用本地端口转发来测试它,方法是执行ssh -L 8080:www.nytimes.com:80 127.0.0.1。然而,这个命令提供的密钥指纹与我执行ssh-keygen -l时得到的密钥指纹不一样。即使我删除了我的.ssh目录,我仍然得到相同的指纹,而不是我用ssh-keygen创建的那个。我的系统上还有另一个密钥吗?这个密钥在哪里?我如何选择这个密钥供openssh-server使用?

/etc/ssh/ssh_host_*_key.pub - user677955
3个回答

当您进行SSH会话时,涉及到两对不同的密钥(每对都有一个指纹)。其中一对是用户的密钥,存储在~/.ssh中。用户的SSH密钥身份有时用作登录到另一台计算机的凭据(如果您已设置基于密钥的登录)。
另一对是SSH服务器的密钥。这是您第一次连接到不同服务器时看到指纹的密钥。该密钥的身份用于确保您登录到的是您打算登录的SSH服务器。如果您使用密码,这一点非常重要,因为您不希望意外尝试登录到攻击者的机器:当您输入密码时,攻击者将获得您的密码。然后,攻击者可以登录到您认为自己正在登录的机器!(这被称为"中间人攻击"当您登录到SSH服务器时,用于标识其自身的密钥位于/etc/ssh/中,通常命名为ssh_host_rsa_key之类的名称。 你实际上可以在/etc/ssh/sshd_config文件中使用HostKey /path/to/host/key设置来更改SSH服务器查找密钥的位置。
默认情况下,ssh-keygen会为当前用户创建一个密钥,默认情况下,它将存储在~/.ssh中。用户密钥和服务器密钥的格式是相同的;区别在于它们放置的位置以及/etc/ssh/sshd_config是否有指向它们的HostKey指令。当您安装openssh-server软件包时,它会自动生成服务器使用的密钥。这就是未知指纹的密钥的来源。如果您想查看SSH服务器(RSA*)密钥的指纹,可以运行ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub
*有不同的加密算法。每个算法都使用不同的密钥。常见的算法有DSA(弱)、RSA(旧默认)和ECDSA(新默认)。

2尽管“set ssh fingerprint”这些术语在技术上是不正确的,但谷歌搜索结果却出奇地糟糕。很庆幸我在其中找到了这个。 - Bart van Heukelom
5谢谢这个。有一点要注意:如果你将ssh-keygen指向公钥,就不需要使用'sudo'。也就是说:ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub。另外,在我的安装中,ssh守护进程使用的是ECDSA密钥,而不是RSA密钥,所以实际上我需要运行的是ssh-keygen -lf /etc/ssh/ssh_host_ecdsa_key.pub - John Clements
从我的旧硬盘中获取公钥并在新安装中使用它们,覆盖/etc/ssh目录下的公钥,这样做会有任何问题吗?毕竟,一把密钥就是一把密钥,对吗? - Adam
@Adam,我认为这样做没有问题。这样做可以避免在远程登录时出现问题,因为密钥已更改(如果重新安装,则会生成新的密钥)。 - Azendale
5当我第一次通过ssh连接到14.04主机时,它会显示MD5指纹。要使16.04的ssh-keygen显示MD5指纹,您必须使用-E md5选项。 - jarno
1非常出色的回答。非常完整。 - Woodstock

SSH主机密钥存储在/etc/ssh/目录下,通常您不需要进行选择。这些密钥是在安装openssh-server软件包时生成的。
您可以通过ssh-keygen -l -f /etc/ssh/ssh_host_key.pub命令列出密钥的指纹,但您需要为每个公钥重复此操作。

 


ssh-keygen在您的服务器上不会生成SSH指纹。这是由SSH服务器生成的。ssh-keygen为您的系统创建了一个公钥/私钥对,您以后可以使用该对来访问您的SSH服务器,而无需将明文密码传输到服务器。

您的服务器的指纹显然不会显示为您生成的公钥/私钥对的指纹,因为它们彼此独立。


4请注意,您应该能够为您的服务器生成SSH密钥(与您所说的相反),但您只需将它们放在正确的位置,以便用于该目的。 - Azendale
ssh-keygen还可以在服务器端使用,以多种格式生成指纹,以便您可以在客户端验证它们。 - oligofren