手头有密钥对,并且私钥可以工作,如何在服务器上找到“对应的公钥”并比较指纹?

手头有密钥对,并且私钥可以工作,如何在服务器上找到“对应的公钥”并比较指纹?

我有来自远程主机的指纹,根据什么是 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每个不同的用户都有不同的子文件夹、密码和机密。请相应地投票,意思是:另一个答案是针对“较早的问题”的,虽然没有被接受,但当然是有帮助的。

相关内容