有没有办法以编程方式获取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-keyscan
OpenSSH 版本 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。