获取SSH服务器密钥指纹

获取SSH服务器密钥指纹

有没有办法以编程方式获取SSH服务器密钥指纹无需验证到它?

我正在尝试ssh -v user@host false 2>&1 | grep "Server host key",但如果未设置基于密钥的身份验证,则会挂起等待密码。

答案1

您可以通过组合ssh-keyscan和来做到这一点ssh-keygen

$ file=$(mktemp)
$ ssh-keyscan host > $file 2> /dev/null
$ ssh-keygen -l -f $file
521 de:ad:be:ef:de:ad:be:ef:de:ad:be:ef:de:ad:be:ef host (ECDSA)
4096 8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d host (RSA)
$ rm $file

编辑:从 OpenSSH 7.2 开始,这个 oneliner 可以工作:

ssh-keyscan host | ssh-keygen -lf -

(归功于@mykhal)

答案2

我最近不得不自己做这件事,所以我想我应该添加一个答案来说明如何做到这一点(使用以下版本OpenSSH 7.2 或更高版本)在一行中使用进程替换:

ssh-keygen -lf <(ssh-keyscan localhost 2>/dev/null)

localhost此处替换为主机名)


以下文本解释了这些命令的工作原理,并重点介绍了旧版和新版 OpenSSH 实用程序之间的一些行为差异。

获取公共主机密钥

开发该ssh-keyscan命令的目的是为了让用户无需向 SSH 服务器进行身份验证即可获取公共主机密钥。从其手册页:

ssh-keyscan是一个用于收集多个主机的公共 ssh 主机密钥的实用程序。它旨在帮助构建和验证 ssh_known_hosts文件。

钥匙类型

使用该选项指定要获取的密钥的类型-t

  • rsa1(已废弃的 SSH 协议版本 1)
  • rsa
  • dsa
  • ecdsa(OpenSSH 的最新版本)
  • ed25519(OpenSSH 的最新版本)

在现代 OpenSSH 版本中,默认要获取的关键类型是rsa (自版本 5.1)、ecdsa(自版本 6.0)和ed25519(自版本 6.7)。

旧版本(在ssh-keyscanOpenSSH 版本 5.1 之前), 默认密钥类型已过时rsa1(SSH 协议 1),因此需要显式指定密钥类型:

ssh-keyscan -t rsa,dsa hostname

获取 Base64 密钥的指纹哈希值

ssh-keyscan打印 SSH 服务器的主机密钥Base64 编码 格式。要将其转换为指纹哈希,ssh-keygen可以使用该实用程序及其-l选项来打印指定公钥的指纹。

如果使用 Bash、Zsh(或 Korn shell),流程替代可用于方便的单行:

ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)

笔记:在 7.2 之前的 OpenSSH 版本中,用于读取文件的函数 ssh-keygen不能很好地处理命名管道 (FIFO),因此此方法不起作用,因此需要使用临时文件。

哈希算法

最新版本ssh-keygen印刷版SHA256密钥的指纹哈希值。要得到MD5服务器密钥指纹的哈希值(旧行为),该-E 选项可用于指定哈希算法:

ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null)

使用管道

dash如果使用不具有进程替换功能的POSIX shell(例如),则使用临时文件的其他解决方案将起作用。然而,对于较新版本的 OpenSSH(自 7.2 起),可以使用简单的管道,因为ssh-keygen它将接受-作为标准输入流的文件名,从而允许单行管道命令。

ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf -

答案3

nmap通过使用ssh-hostkey脚本提供此功能。

要返回密钥的十六进制指纹:

$ nmap [SERVER] --script ssh-hostkey

要返回密钥的内容:

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=full

返回按键的视觉气泡

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey='visual bubble'

要返回以上所有内容:

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=all

来源:nmap 文档

答案4

filezilla 显示使用十六进制 md5 散列的密钥格式。

在您的ubuntu linux机器使用这个命令:

ssh-keygen -l -E md5 -f <(ssh-keyscan localhost 2>/dev/null)

注意:将“localhost”替换为您要检查的计算机的 IP。

相关内容