Internet 上 SSH 的公钥与 LAN 上 SSH 的公钥不同

信息安全 公钥基础设施 SSH 密钥管理 密钥交换 钥匙
2021-09-08 04:43:23

我有一个 Raspberry Pi,当我的笔记本电脑在同一个网络中时,可以通过 SSH(通过用户密码进行身份验证)访问它。现在我想通过互联网访问它。

我已经将路由器设置为将端口转发到我的 Raspberry Pi 并安装了 fail2ban 以(希望)通过暴力破解密码是不可行的。

奇怪的是,当我通过互联网而不是通过 LAN 访问 Pi 时,我得到了一个不同的密钥:

christoph@christoph-laptop-14-04:~$ ssh-keygen -H -F 192.168.1.92
# Host 192.168.1.92 found: line 9 type ECDSA
|1|Zz8zhCYwRu7jKa/bcUTnw/BzGmo=|m2E+0RwiVXcr8lAxbK/W13ZmZUA= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBAgUNwcHmVBowUoKvi9iLtoKifh/9qKAj6BNfQsYzYuoXtlYEnTUVLn4XpMYJ9+TMwL23ZDnmJuz8noKK3rFrYg=
christoph@christoph-laptop-14-04:~$ ssh-keygen -H -F [my global IP]
# Host 185.5.10.87 found: line 10 type ECDSA
|1|kEE5HDC1uBkqDN3SpQ8yFvwdj0A=|iDaNuB2Y8d3kIFPqFoXjrERRJ/0= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBAgUNwcHmVBowUoKvi9iLtoKifh/9qKAj6BNfQsYzYuoXtlYEnTUVLn4XpMYJ9+TMwL23ZDnmJuz8noKK3rFrYg=

除了开始之外,一切都是一样的。那么为什么开头不一样呢?IP地址是编码成这个还是类似的?

让我感到困惑的另一件事是,当之前有不同的密钥时(我显然无法连接,因为密钥已更改但也)我看到了这个:

ECDSA key fingerprint is ed:47:24:c6:4e:c1:ca:99:d9:77:59:8f:01:12:85:cd

我可以通过以下方式找出我的一台笔记本电脑:

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

它采用相同的格式。但是当我 ssh 进入我的 Pi 并执行相同的命令时,输出是:

256 SHA256:Npy6IbI8vDd4V3iCOcIVEsF4j2bsf9vbWcsf1ti8izE root@christoph-pi (ECDSA)

这似乎与ed:47:24:c6:4e:c1:ca:99:d9:77:59:8f:01:12:85:cd.

我首先认为这可能Npy6IbI8vDd4V3iCOcIVEsF4j2bsf9vbWcsf1ti8izE是一个 base 64 编码,ed:47:24:c6:4e:c1:ca:99:d9:77:59:8f:01:12:85:cd它似乎是十六进制编码,每个字节用冒号与下一个字节分隔,但长度Npy6IbI8vDd4V3iCOcIVEsF4j2bsf9vbWcsf1ti8izE是 43,不是 4 的整数倍,所以它不是 base64 . 那是什么?

2个回答

奇怪的是,当我通过互联网而不是通过 LAN 访问 Pi 时,我得到了一个不同的密钥:

用于sshd描述known_hosts文件格式的手册页

SSH_KNOWN_HOSTS 文件格式

这些文件中的每一行都包含以下字段:标记(可选)、主机名、[...]。字段由空格分隔。

我们得到了第一个答案。第一个字段是hostname,当您从外部或内部连接时,这显然是不同的,正如您在问题中提出的那样。

我们可以进一步阅读

或者,主机名可以以散列形式存储,如果文件的内容被泄露,则隐藏主机名和地址散列主机名以“|”开头 特点。一行中只能出现一个散列主机名 [...]

是的,您的主机名/IP 地址已经过哈希处理。


但是当我 ssh 进入我的 Pi 并执行相同的命令 [...]

新版本使用 SHA-256 哈希而不是过时的 MD5。您可以使用以下命令强制新版本为您生成旧指纹:

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

这两种格式之间的转换是可能的,但没有用。建议直接使用ssh-keygen我上面建议的解决方案。

known_hosts您可以像这样从存储在文件中的公钥生成指纹:

ssh-keygen -l -f <( ssh-keygen -H -F 192.168.1.92 | tail -n 1 | cut -d" " -f 2,3)

输出的左侧是IP 地址ssh-keygen -H -F 192.168.1.92哈希值。如果您要在没有-H选项的情况下运行命令,您会得到类似于:

christoph@christoph-laptop-14-04:~$ ssh-keygen -F 192.168.1.92
# Host 192.168.1.92 found: line 9 type ECDSA
192.168.1.92 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBAgUNwcHmVBowUoKvi9iLtoKifh/9qKAj6BNfQsYzYuoXtlYEnTUVLn4XpMYJ9+TMwL23ZDnmJuz8noKK3rFrYg=

这会在左侧显示 IP 地址。当使用该-H选项运行时,该命令会显示 IP 地址的哈希值,这对于每个主机来说显然是不同的。


ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key.pub如果您使用不同版本的 ssh-keygen ,输出格式可能会有所不同。

我的 CentOS 机器提供与您的 Raspberry Pi 相同的格式,而我的 Pi 提供与您的笔记本电脑相同的冒号分隔格式。实际输出值明显不同,因为它们输入到命令中的是不同的公钥。