我从 ~/.ssh 目录中删除了我的公钥,为什么我仍然可以在没有密码的情况下访问主机?

我从 ~/.ssh 目录中删除了我的公钥,为什么我仍然可以在没有密码的情况下访问主机?

我在客户端计算机上生成了公钥/私钥对。它们位于~/.sshasid_rsaid_rsa.pub.我将公钥添加到主机的authorized_keys文件中,现在我可以成功进行 SSH,而无需输入密码。

现在,我将公钥从该文件夹中移出mv ~/.ssh/id_rsa.pub ~/,并尝试再次通过 SSH 连接到主机,预计会失败(因为公钥丢失),但它仍然有效!怎么会?如果公钥不在目录中,它如何找到公钥~/.ssh(我也尝试将其移动到主文件夹之外的不同位置,并且它仍然在没有密码验证成功的情况下连接)。

答案1

确保您的密钥没有被 ssh-agent 缓存。

获取缓存密钥列表:

ssh-add -l

删除所有缓存的键:

ssh-add -D

答案2

使用公钥加密技术,您可以给出公钥并保持私钥......私有。当有人想要向您发送某些内容时,他们使用公钥对其进行加密,而您则使用私钥对其进行解密。一旦您给出了公钥,您就不需要它来解密消息。

我不知道 ssh 如何使用这些密钥的详细信息,但在使用该-v选项时,我看到:

$ ssh -vvv vm
...
debug1: identity file /Users/username/.ssh/id_rsa type 0
...
debug1: Offering public key: /Users/username/.ssh/id_rsa RSA SHA256:...
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 60
debug1: Server accepts key: /Users/username/.ssh/id_rsa RSA SHA256:/...

鉴于此,我的猜测是它使用私钥来获取公钥,然后将公钥发送到远程主机。

如果您想要使该配置不再有效,您需要[重新]移动私钥 ( ~/.ssh/id_rsa)。

答案3

你说遥控器仍然有公钥(在~/.ssh/authorized_keys)。并且本地还拥有私钥(~/.ssh/id_rsa)。

就是那样。


是的(对其他答案进行评论)协议只是尝试所有可用的密钥,直到它进入。

发送哈希值只是更快地找到密钥的一种方法。远程将散列其所有公钥,比较散列,并使用匹配的密钥。公钥可以从私钥(文件)推导出来。

debug1: Offering public key: /Users/username/.ssh/id_rsa RSA SHA256表明客户端正在从私钥文件中派生公钥哈希。因此,公钥就在那里,或者可以从私钥导出公钥(取决于密钥类型)。

答案4

并再次尝试通过 SSH 连接到主机,预计会失败(因为公钥丢失),但它仍然有效!怎么会?

一旦您将公钥发送到远程服务器(并且远程服务器已将您的公钥存储在其authorized_keys文件中),您就不再需要您的公钥文件。您需要进行身份验证的只是您的私钥。

当然,保留公钥文件是一个很好的做法。但因为 RSA 私钥包含公钥,您始终可以从私钥文件中提取公钥文件。

具体来说,这是 RSA 私钥的内容:

-----BEGIN RSA PRIVATE KEY-----
RSAPrivateKey ::= SEQUENCE {
  version           Version,
  modulus           INTEGER,  -- n
  publicExponent    INTEGER,  -- e
  privateExponent   INTEGER,  -- d
  prime1            INTEGER,  -- p
  prime2            INTEGER,  -- q
  exponent1         INTEGER,  -- d mod (p-1)
  exponent2         INTEGER,  -- d mod (q-1)
  coefficient       INTEGER,  -- (inverse of q) mod p
  otherPrimeInfos   OtherPrimeInfos OPTIONAL
}
-----END RSA PRIVATE KEY-----

这是 RSA 公钥的内容:

-----BEGIN RSA PUBLIC KEY-----
RSAPublicKey ::= SEQUENCE {
    modulus           INTEGER,  -- n
    publicExponent    INTEGER   -- e
}
-----END RSA PUBLIC KEY-----   

来源:RFC 3447。

相关内容