如何在 Openssh 中验证主机指纹

Emi*_*ter 14 ssh openssh ssh-keys

当我尝试从远程机器连接到家用机器时,如何验证新连接主机的指纹。第一次连接时,我得到了这个:

emiter@very-far-machine.org$ ssh emiter@home-machine.org:~/
The authenticity of host '[home-machine.org]:222 ([x.xx.xx.xx]:222)' can't be established.
ECDSA key fingerprint is SHA256:6lr/VtTwgrKZVNZQ8y8Le/ilfBYfo0e+9UliSg+AD2k.
Are you sure you want to continue connecting (yes/no)? 
Run Code Online (Sandbox Code Playgroud)

如何检查我的“家用机”的指纹?我试图像这样在我的家用机器上列出它们:

emiter@home-machine.org:~$ for pubkey_file in /etc/ssh/*.pub; do ssh-keygen -lf ${pubkey_file};  done
1024 d1:ef:db:b4:24:fc:ca:fe:e1:11:8c:36:0a:77:90:49 /etc/ssh/ssh_host_dsa_key.pub (DSA)
256 d9:25:51:16:ca:76:bd:8f:b8:6a:79:a2:1c:81:4b:4c /etc/ssh/ssh_host_ecdsa_key.pub (ECDSA)
2048 3a:c6:2d:29:7c:b9:16:e8:ed:1c:a8:26:5d:ab:0d:1e /etc/ssh/ssh_host_rsa_key.pub (RSA)
emiter@home-machine.org:~$ 
Run Code Online (Sandbox Code Playgroud)

但是这些键似乎采用不同的格式。这是某种指纹的MD5吗?我如何才能以统一格式获得这些指纹?

ver*_*era 12

您的 ssh 服务器提供 sha256 公钥哈希,这比 md5 哈希安全得多。

然后,您必须向 ssh-keygen 指定您想要 sha256 而不是 md5 哈希。尝试在您的家用机器上执行命令:

for pubkey_file in /etc/ssh/*.pub; do ssh-keygen -lf ${pubkey_file} -E sha256; done

  • OpenSSH 应默认为 sha256。如果没有,则可能意味着客户端计算机上的 OpenSSH 版本较旧且不支持 sha256。所以“-E”开关很可能没有帮助。 (3认同)

Nic*_*LST 7

使用的命令

  • 显示存储在服务器上的公共主机密钥的 ascii-art(在服务器端完成,您通过 ssh 连接到的那个):

    ssh-keygen -l -v -E md5 -f /etc/ssh/ssh_host_ecdsa_key.pub
    
    Run Code Online (Sandbox Code Playgroud)

    -l : 显示指定公钥文件的指纹。

    -v : 视觉 (ascii-art)

    -E md5:用于计算指纹的哈希算法(“md5”或“sha256”)。(如果可用,首选“sha256”)。(在旧版本的 ssh-keygen 中可能不可用)

    -f : 文件

  • 显示远程服务器公共主机密钥的 ascii-art(在客户端完成,您通过 ssh 连接的那个):

    ssh -o visualhostkey=yes -o FingerprintHash=md5 <host_server_to_connect>
    
    Run Code Online (Sandbox Code Playgroud)

    -o : 选项

    visualhostkey : 视觉 (ascii-art)

    FingerprintHash : 要使用的哈希算法(使用与您从服务器获取的相同:md5 或 sha256)

如何检查主机/服务器的真实性

首先, 1. 是在服务器本地完成(你想通过 ssh 连接到的那个):它会给你一个第一个 ascii-art。打印或拍照。

二、2.是在第一次SSH连接时进行;它将显示第二个 ascii-art。如果 ascii-art 是相同的,那么您可以对“我信任吗?”回答问题(即Are you sure you want to continue connecting (yes/no))。

例子

  • 服务器端
$ ssh-keygen -l -v -E md5 -f /etc/ssh/ssh_host_ecdsa_key.pub
256 2e:a6:b3:27:14:12:0b:79:df:9a:7f:bd:4d:b1:e0:b6   (ECDSA)
+--[ECDSA  256]---+
| .               |
|o o              |
| o + .           |
|  o o .          |
|   . +  S . .    |
|    +  . . . o   |
|   . .o ..o o    |
|    ooo....+     |
|    o= .  E..    |
+-----------------+
Run Code Online (Sandbox Code Playgroud)
  • 客户端
$ ssh -o visualhostkey=yes -o FingerprintHash=md5 192.168.12.211
The authenticity of host '192.168.12.211 (192.168.12.211)' can't be established.
ECDSA key fingerprint is MD5:2e:a6:b3:27:14:12:0b:79:df:9a:7f:bd:4d:b1:e0:b6.
+---[ECDSA 256]---+
| .               |
|o o              |
| o + .           |
|  o o .          |
|   . +  S . .    |
|    +  . . . o   |
|   . .o ..o o    |
|    ooo....+     |
|    o= .  E..    |
+------[MD5]------+
Are you sure you want to continue connecting (yes/no)? 
Run Code Online (Sandbox Code Playgroud)

更多解释

第一个命令将显示与您作为输入提供的文件的指纹(以及指纹本身)相对应的 ascii-art。您作为输入提供的文件是服务器的公共主机密钥。当客户端连接时(不仅是第一次),服务器将发送其公共主机密钥。此公共主机密钥将在~/.ssh/known_hosts. 如果公钥在文件中,那就没问题:主机(服务器)是已知的,所以我们继续下一步对用户进行身份验证(本文未描述用户身份验证)。如果公钥不在文件中,则客户端将使用哈希算法计算此公钥的指纹(不同的哈希算法将给出不同的指纹)。显示先前计算的此指纹(如果提供相应选项,则与 ascii-art 一起显示),您必须根据您识别此指纹或否来回答是或否(此指纹是公共主机密钥的图像/哈希)服务器)。如果你说是,那么服务器的公钥(不是它的指纹)将被添加到文件中~/.ssh/known_hosts

我们可以注意到~/.ssh/known_hosts在你家(~)目录下,因为信任这个主机(服务器),但是不同的用户可能和你不一样信任。此外,服务器的主机公钥不依赖于用户,因此它存储在/etc/ssh/.

第二个命令将显示从host_server_to_connect收到的公钥的指纹和 ascii-art (根据选项中给出的哈希算法)。它与仅执行 ssh 相同,但具有更多视觉选项,因此连接将以与普通 ssh 连接相同的方式继续。

  • 当你在评论中问我一个问题时,我会在评论中回答:我在谈论 ascii-art,因为 ascii-art 是一种“在 Openssh 中验证 [the] 主机指纹”的视觉方式。 (2认同)