我在客户端计算机上生成了公钥/私钥对。它们位于~/.ssh
asid_rsa
和id_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-----