如何在没有密码和提供私钥的情况下访问不受信任的 SSH 服务器?

如何在没有密码和提供私钥的情况下访问不受信任的 SSH 服务器?

这个答案解释如何设置基于密钥的 ssh 身份验证,以避免每次访问时重新输入密码。

然而,它显然需要向服务器提供客户端的私钥(不!请参阅编辑。)除非客户端的密钥没有密码。在我看来,这对客户端来说似乎不安全。有没有办法设置基于密钥的 ssh 身份验证,而无需向服务器提供客户端信息?

例如,通过存储一些服务器的客户端机器中是否有私钥?毕竟,当我们使用密码登录时,我们是在向服务器证明我们(客户端)知道只有服务器才拥有的信息。而不是相反。

个人情况:我有一个工作站,理论上只有我才能访问,但它被放置在一个需要密码“监视”的位置。所以除了工作需要运行的程序外,我没有任何其他文件。但是,有时我需要通过 SSH 访问它。

编辑:我误解了几件事。客户端的私钥实际上永远不会提供给服务器。请参阅接受的答案我认为,使用我的公钥和密钥的密码,任何人都可以恢复我的私钥,我还认为,通过遵循基于密钥的 ssh 身份验证指南,我将向服务器提供我的公钥和密钥的密码(除非没有密码),因此我基本上会得到我的私钥(不安全!)。但首先,密码没有提供给服务器!密钥生成密码仅用于本地(在客户端的机器中)解密私钥,因此要求输入密码的提示来自客户端的解密器,而不是服务器。其次,即使服务器有密码和公钥,也无法推断出私钥。这些和其他事情在接受的答案中提到了。

答案1

但是,它显然需要向服务器提供客户端的私钥(或客户端的无密码公钥)。在我看来,这对客户端来说似乎不安全。(我误解了什么吗?)

您几乎误解了所有这一切。

  1. 客户端的私钥是绝不提供给服务器。(帖子中字面意思是“上传公钥”。)即使在身份验证期间,私钥部分也不会按原样发送 - 它仅用于创建数字签名作为您拥有私钥部分的“证明”;服务器仅使用密钥的公钥部分来验证签名。

    (这与 TLS 的工作方式类似;HTTPS 网络服务器永远不会向您发送 TLS 证书的私钥,而只会发送签名作为证明钥匙。)

  2. “无密码”根本不适用于公钥。密钥生成期间提供的密码(密码短语)仅用于加密包含私有部分的文件 - 公共部分是公开的,因此无需加密。

    密码仅用于当地的私钥文件的加密(永远不会发送到任何地方),因此密钥“无密码”只有在以下情况下才有意义:客户机器不受信任(例如,如果文件存在在一夜之间被盗的风险)——服务器无法分辨,因为它永远看不到文件,无论是否加密。

  3. 将公钥提供给不受信任的服务器本质上并不不安全,除非选择了非常弱的密钥算法(OpenSSH 支持的任何算法都不会出现这种情况)。

    一般来说,公钥加密的重点在于,仅知道公钥是无法推导出私钥的。例如,所有 TLS(HTTPS)都依赖于这一假设;TLS 服务器会定期将其公钥发送给客户端(作为证书的一部分,以验证服务器的身份)。

  4. 具体来说,让服务器知道客户端的公钥不授予任何访问权限对于客户端来说——服务器不能直接转身将相同的密钥发送给客户端来获得访问权限。

    甚至如果客户端恰好接受入站 SSH,并且如果客户端设置为接受其自己的密钥(尽管这并不罕见),则服务器无法执行任何操作,因为它没有相应的私有部分来进行“证明”签名。

    (这可以使用密码登录时执行的操作。

  5. 就像您可以为不同的服务器使用不同的密码一样,您也可以为不同的服务器生成不同的 SSH 密钥对;您并不局限于一个“客户端密钥”。

    因此,如果隐私是一个问题(例如,知道可以将 SSH 公钥与 GitHub 身份匹配),那么您就ssh-keygen离拥有一个新的公钥只有一步之遥了。

例如,将服务器的私钥存储在客户端计算机中?毕竟,当我们使用密码登录时,我们是在向服务器证明我们(客户端)知道只有服务器才拥有的信息。而不是相反。

不,从某种意义上来说相反——你向服务器证明你(客户端)知道一条信息只有你(客户)有。服务器甚至没有实际的密码,它只有足够的信息来验证您发送的密码是否正确。

公钥认证的工作原理相同:你发送证据,证明你知道只有你(客户端)才知道的一条信息(私钥)。只不过你不是发送这条信息本身,而是仅有的发送用它制作的证明。

[评论]是的,但是如果服务器拥有多个私钥,并为每个客户端提供一个私钥,它就可以确认某人是某个客户端,如果他们表明他们知道与该客户端相关的服务器的私钥,不是吗?

您所描述的实际上与使用密码相同;它忽略了使私钥/公钥比密码更安全的所有功能。如果服务器存在被窃听的风险,那么您的机制将面临与仅使用该服务器独有的密码相同的风险。

这是一种避免暴露客户私钥的方法

客户端的私钥是已经永远不会暴露;这就是使用密钥对而不是密码的全部意义所在。

为什么当我第一次尝试登录时,他们会要求我输入密码来解锁我的私钥?

密钥文件以加密形式存储;即使它不会被发送任何地方,除非先解密,否则 SSH 客户端也无法使用密钥执行任何本地操作。(能够在不解密的情况下使用加密密钥反而违背了加密的意义……)

相关内容