我使用什么命令查看服务器的ECDSA密钥指纹是什么?


Answers:


124

等等,我找到了。运行命令:

ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key.pub

4
请注意,这将以您的服务器操作系统的首选格式来计算指纹的哈希值。根据您的本地操作系统,您可能需要使用旧的哈希格式:ssh-keygen -l -E md5 -f /etc/ssh/ssh_host_ecdsa_key.pub例如,当从ubuntu 12.04连接到ubuntu 16.04时
Jeff

这也适用于Mac OS(用于验证远程登录的真实性)。
豪尔赫·雷涛

15

使用最新的ssh(OpenSSH_6.0p1,OpenSSL 1.0.0j,2012年5月10日),我编写了如下脚本:

ssh-keyscan -t ecdsa localhost 2>&1 | grep ecdsa
localhost ecdsa-sha2-nistp256 AAAAE2VlongKey...=

笔记:

  • 如果您的sshd在自定义端口上运行,请-p portNumberssh-keyscan命令中添加' ' )
  • ssh-keyscan写在上stderr,而不是stdout(!),因此bash重定向为' 2>&1'(根据您的shell可能有所不同)

这是我添加到~/.ssh/known_hosts文件中的行,用于授权来自本地主机的ssh请求进行我的测试(主要是针对使用ssh的gitolite)。


DanielBöhmer在评论中确认:

  • ssh-keyscan 提供SSH服务器的完整公钥
  • 的输出ssh-keygen几乎与公钥文件的格式相同。
    只需删除第一列(IP地址或主机名)并将其保存或通过管道传输到ssh-keygen -l显示指纹的列即可。

丹尼尔补充说:

显示存储在中的所有服务器公共密钥的指纹~/.ssh/know_hosts

cut -d' ' -f2- ~/.ssh/known_hosts | while read line; do echo "$line" | ssh-keygen -lf-; done

1
问题是关于钥匙的指纹。ssh-keyscan仅提供(公共)密钥。
aleb 2015年

1
实际上,ssh-keyscan提供了SSH服务器的完整公共密钥。我有其输出的转储,现在想将其与ssh第一次连接时显示的指纹进行比较。怎么做?
DanielBöhmer2015年

我刚刚发现:的输出ssh-keygen几乎与公钥文件的格式相同。只需删除第一列(IP地址或主机名)并将其保存或通过管道传输到ssh-keygen -l显示指纹的列即可。我仍然想知道ssh在要求确认时如何显示服务器的完整公钥。
DanielBöhmer2015年

@DanielBöhmer谢谢您的反馈。我将其包含在答案中以提高可见性。
VonC 2015年

显示存储在~/.ssh/know_hosts以下位置的所有服务器公钥的指纹:cut -d' ' -f2- ~/.ssh/known_hosts | while read line; do echo "$line" | ssh-keygen -lf-; done
DanielBöhmer19年

8

在我的系统上,我需要指定MD5密钥而不是默认的SHA256:

ssh-keygen -l -E md5 -f /etc/ssh/ssh_host_ecdsa_key.pub

这将以与我在客户端上看到的错误相匹配的格式输出字符串。


1
-E标志是在OpenSSH> 6.6中引入的,大约在默认情况下切换到SHA256指纹识别时。因此,在客户端显示SHA256指纹的情况下,不能将其用于在服务器上输出该格式。解决方法:superuser.com/a/1030779
tanius

5

使用的命令

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

    ssh-keygen -l -v -f /etc/ssh/ssh_host_ecdsa_key.pub
    

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

    -v:视觉(ascii-art)

    -f:文件

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

    ssh -o visualhostkey=yes -o FingerprintHash=md5 <host_server_to_connect>
    

    -o:选项

    visualhostkey:视觉(ascii-art)

    FingerprintHash:使用的哈希算法

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

首先,1.在服务器上本地完成(您要通过ssh连接TO的服务器):它将为您提供第一本ascii-art。打印或拍照。

其次,2.将在第一个SSH连接上完成;它将显示第二种ascii艺术。如果ascii艺术相同,那么您可以对“我信任吗?”回答问题(即Are you sure you want to continue connecting (yes/no))。

  • 服务器端
$ ssh-keygen -l -v -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..    |
+-----------------+
  • 客户端
$ 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)? 

一些更多的解释

第一条命令将显示与您输入的文件指纹对应的ascii-art。输入的文件是服务器的公共主机密钥。当客户端连接时(不仅是第一次),服务器将发送其公共主机密钥。此公共主机密钥将在以下位置搜索~/.ssh/known_hosts。如果公用密钥在文件中,则可以:主机(服务器)已知,因此我们继续进行下一步以验证用户身份(本文中不介绍user auth)。如果公钥不在文件中,则客户端将使用哈希算法计算此公钥的指纹(不同的哈希算法将给出不同的指纹)。显示先前计算出的该指纹(如果提供了相应选项,还会显示ascii-art),您将不得不回答是或否,这取决于您识别出该指纹或否(此指纹是密码的公共主机密钥的图像/哈希)服务器)。如果您选择是,则服务器的公钥(不是其指纹)将添加到文件中~/.ssh/known_hosts

我们可以注意到,该~/.ssh/known_hosts目录位于您的主目录(〜)下,因为信任该主机(服务器),但是其他用户可能不信任您。另外,服务器的主机公钥也不依赖于用户,因此将其存储在中/etc/ssh/

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.