我有来自远程主机的指纹,根据什么是 SSH 密钥指纹以及如何生成它?。
询问主机指纹:
ssh-keygen -lf <(ssh-keyscan MY_SERVER.com 2>/dev/null)
例如:
2048 SHA256:asdfaewfbadsdasfasgasefasfasdvfth56sdghjum7 id_rsa (RSA)
以及以下行:
ssh -o visualhostkey=yes -o FingerprintHash=SHA256 MY_SERVER.com
达到相同:
2048 SHA256:asdfaewfbadsdasfasgasefasfasdvfth56sdghjum7 id_rsa (RSA)
并且足以说明该连接是预期的。
另一方面,我手头有服务器的公钥(MY_PUBLIC_SSH_KEY)+私钥(MY_PRIVATE_SSH_KEY)。我可以使用私钥连接到服务器,然后使用正确的 login_name,我不再需要输入密码,这就是 ssh 密钥的理念。因此,服务器上保存的公钥必须也是正确的:
ssh -o visualhostkey=yes -o FingerprintHash=SHA256 -i MY_PRIVATE_SSH_KEY MY_LOGIN_NAME@MY_SERVER.com
# # or the same:
# ssh -o visualhostkey=yes -o FingerprintHash=SHA256 -i MY_PRIVATE_SSH_KEY MY_LOGIN_NAME@MY_SERVER.com
但是公共 ssh 密钥 MY_PUBLIC_SSH_KEY 的指纹与服务器的指纹并不相同。它不使用2048
底层密钥的位大小,而是使用默认值4096
:
ssh-keygen -b 2048 -t rsa -lf id_rsa.pub
给出:
4096 SHA256:asfawefbrgaqeffaefafrew546rtghhdhdfhsert45y id_rsa (RSA)
我手头有的公钥如下:
ssh-rsa AAAABasfjjeiaj;jkaskl;dfkjsafe9w0fo-0oas[kfoamks;dfk...(4096 bits size)== MY_FILE_NAME
而在服务器上(cat .ssh/id_rsa.pub
)是:
ssh-rsa AAAABasfjieajfjaei;jfi;ajisejifjdfasdf(2048 bits size)...== ANOTHER_DIFFERENT_FILENAME
指纹并不相同,因为底层密钥长度和末尾添加的注释不同。但它们应该是同一件事。该-b
参数对任何事情都没有反应,我甚至可以使用-t ecdsa
,指纹仍然会相同,就好像它总是给出一些已经由公钥内容本身固定的东西。
ssh-keygen
始终默认为 4096 位密钥大小,我需要 2048,-b 参数似乎不起作用。
从这里我可以看出,要么公钥已经更改为更好的 4096 标准,并且可能ssh-keygen
默认-t
使用新公钥中使用的参数,而服务器仍然出于某种原因输出旧指纹,要么公钥的指纹不可能是与主机的指纹相同,因为它们是根据不同的位大小计算出来的。
我还发现你可以更改默认值ssh-keygen
,请参阅您能让 ssh-keygen 的默认客户端密钥长度更大吗?,但它不应该也与参数一起起作用吗-b
? 4096 是一个很好的默认值,我不想更改它。 或者我在这里忽略了一些一般性的东西?
我从其他问答中知道,完成上述两个步骤即可获得相同的指纹。但是,如果上面的成功比较不需要该 4096 位公钥的指纹,那么我仍然想知道我应该如何处理该指纹。
我肯定是理解错了。手头有密钥对,而且私钥有效,我该如何在服务器上找到“对应的公钥”并比较指纹?
答案1
-b 参数对任何东西都没有反应,我甚至可以使用 -t ecdsa,指纹仍然会相同,就好像它总是给出一些已经由公钥内容本身修复的东西。
是的,这实际上就是公钥的工作原理——所有这些参数都定义了密钥本身,不是指纹,一旦密钥生成,它们就几乎是不可改变的。
该-b
参数实际上定义了密钥的大小;如果您有一个 4096 位大小的 RSA 密钥,它将总是大小为 4096 位,它将总是是 RSA 密钥。您不能只是要求软件将其缩短为 2048 位,或将其视为 ECDSA 密钥。
因此,因为-l
选项ssh-keygen -l
指示它显示有关现有密钥的信息,这意味着如果它显示“4096”,那么这是一个 4096 位密钥事情就这样结束了。
但这些选项与计算指纹无关。SSH 密钥指纹只不过是公钥的直接 SHA256 哈希值。如果您查看实际的公钥文件,它由“密钥类型密钥数据注释”组成;其指纹只是“密钥数据”字段的 SHA256(),经过 Base64 解码后。例如:
$ ssh-keygen -lf id_rsa.pub
2048 SHA256:aOWdMg2Aoocj1yO90p9646d7ktNPIAjbjWm1PXTA9P0 root@frost (RSA)
$ awk '{print $2}' id_rsa.pub | base64 -d | openssl sha256 -binary | base64
aOWdMg2Aoocj1yO90p9646d7ktNPIAjbjWm1PXTA9P0=
如您所见,整个过程中甚至不会检查密钥类型,更不用说检查类型特定的参数(例如 RSA 素数的位大小)。
虽然 SSH 服务器通常都拥有 RSA 密钥和ECDSA 密钥,两者通常存储在不同的文件中,因此如果您想查看 ECDSA 密钥的指纹,则必须复制正确的文件。(“公共”文件可以连接在一起形成一个文件,然后 ssh-keygen 会自动列出多个指纹。)
答案2
这个答案只说明了我最终是如何完成的,以及为什么理论和现实在这里有点差距,因此我不得不接受我自己的答案,而不用说其他答案没有帮助。对于更典型的设置,您可能会从其他答案中学到更多。
仅供用户登录的服务器
服务器设置为让每个用户使用自己的“公钥之家”进入!这是一个 LDAP(轻量级目录访问协议)身份验证系统,该服务器不再使用该系统。
一步步
如何找到用户公钥
.ssh
我必须在映射到广泛用户的“密码文件夹名称”列表中查找哪里可以找到包含公钥的文件夹:
etc/pass
(服务器各个用户的长列表,以及他们的密码/秘密映射):
... [long list]
proxy:x:13:13:proxy:/abc:/bin/sh
www:x:33:33:www:/xyz/www:/bin/sh
backup:x:34:34:backup:/zyx/backups:/bin/sh
... [long list]
www
因此我的用户可以.ssh
在/xyz/www
。
(旁注:当浏览服务器而没有在终端中看到目录树时,您可以使用来pwd
查看您所在的位置。)
用户 .ssh 中的公钥已过期
我切换到了/xyz/www/.ssh
。但是在文件夹中,有一个过时的 2048 位公钥“id_rsa.pub”,而不是问题前两个命令中的服务器公钥——再次使用指纹命令进行检查。
服务器公钥无处可寻
我仍然不知道问题前两个命令的 2048 位服务器密钥在哪里,这不是这里的问题,但我猜是因为它在/root
那里,但我无法在终端中打开。还有一个 root 用户用于/root/.ssh
密钥和密码。由于服务器是虚拟机,因此启动时的工作目录会随着用户而变化,并且会为每个用户安装不同的卷。
找到 4096 位公钥
所需的 4096 位密钥位于authorized_keys
同一文件夹中的文件中。该authorized_keys
文件如下所示:
$ cat authorized_keys
... [longer list]
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAA... +some comment
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABA... +some comment
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABA... +some comment <-- my key
列表中的最后一个密钥“我的密钥”也是我手头拥有的公钥,请参见上面的问题(我更改了所有地方的字母,但我采用了上面的例子):
ssh-rsa AAAABasfjjeiaj;jkaskl;dfkjsafe9w0fo-0oas[kfoamks;dfk...(4096 bits size)== MY_FILE_NAME
旁注:MY_FILE_NAME 是您在制作密钥对时添加的注释,您可以自由选择,在我的情况下,file_name 可以是任何内容。
此密钥与服务器密钥(问题中的前两个示例)不同,但它是我用我的用户连接到服务器时检查的密钥www
。
指纹匹配
由于两个公钥相同,因此它们的指纹也匹配,两者
ssh-keygen -lf id_rsa.pub
给
4096 SHA256:asfawefbrgaqeffaefafrew546rtghhdhdfhsert45y id_rsa (RSA)
用户公钥
因此,这都与我需要.ssh
为该用户签入的用户公钥有关。它不是服务器密钥,并且仍然存在的服务器密钥不再使用,可能已过时(只有 2048 位)。此服务器的权限和 ssh 密钥均在用户级别进行管理。我猜这已经随着需要更改为 4096 位密钥而增长。由于这种用户访问结构,我在服务器上找不到 4096 位公钥,尽管它必须自从我的私钥起作用以来就存在。
包起来
问题已从
如何从公钥中制作出与服务器指纹相同的指纹?
到:
手头有密钥对,并且私钥可以工作,如何在服务器上找到“对应的公钥”并比较指纹?
因为第一个问题具有误导性。虽然我在提问时对此并不十分了解。它要求提供服务器公钥指纹,但实际上,该全局服务器公钥已不再使用(已过时),并且任何访问都是在用户级别安排的,.ssh
每个不同的用户都有不同的子文件夹、密码和机密。请相应地投票,意思是:另一个答案是针对“较早的问题”的,虽然没有被接受,但当然是有帮助的。