通常,人们建议在任何地方都使用单个私钥-公钥对(如果我们不是在谈论泄露私钥的可能性):
- 最佳实践:“每个用户一个 ssh 密钥”或“每个主机多个 ssh 密钥”
- 重用私钥/公钥
-
当通过 SSH 使用客户端证书身份验证时,这似乎会导致漏洞。由于建议如此受欢迎,我怀疑下面的“算法”不起作用。但我只是不明白它到底有什么问题。
我已尽力使我的描述尽可能详细,以尽量减少可能的差异,所以,请原谅我的长度......
前提条件
- PC1在其已知主机中同时具有(S1_id_rsa.pub和 S2_id_rsa.pub )指纹。
- Server1不知何故知道PC1的帐户在Server2上的存在。
- 键:
- PC1:有P1_id_rsa,S1_id_rsa.pub,S2_id_rsa.pub。
- Server1,攻击者:有S1_id_rsa、P1_id_rsa.pub、S2_id_rsa.pub。
- Server2 : 有S2_id_rsa , P1_id_rsa.pub
算法
这有点像众所周知的中间人攻击,但有点不同。
- PC1向Server1发送“Hi”
- Server1向Server2发送“Hi”
服务器共享它的公钥
- Server2发送Server1 S2_id_rsa.pub
- Server1发送PC1 S1_id_rsa.pub(而不是S2_id_rsa.pub)
- PC1接受S1_id_rsa.pub的指纹(众所周知)
使用Diffie-Hellman生成两个单独的共享秘密隧道:
“服务器 1--服务器 2”
- Server2生成 DH1.a,并将使用 S2_id_rsa 签名的DH1.A发送到Server1
- Server1生成DH1.b,将DH1.B发送给Server2
- 隧道建立
- “PC1--服务器 1”
- Server1生成 DH2.a,并将使用 S1_id_rsa 签名的DH1.A发送到PC1
- PC1生成DH2.b并将DH2.B发送给Server1
- 隧道建立。
客户端身份验证(Server2现在想确保他正在与PC1交谈)
- PC1将P1_id_rsa.pub发送到Server1
- Server1将P1_id_rsa.pub发送到Server2
- Server2生成挑战,只能使用P1_id_rsa解决并将其发送给Server1
- Server1只是通过隧道挑战PC1
- PC1解决挑战并将答案发送到Server1
- Server1隧道应答Server2
- 完毕。
- 完毕
PS我查看了维基百科上的公钥密码学和中间人攻击,以及这个非常详细的答案(我对整个过程的看法主要基于它),但我还没有找到答案。 .
我找不到可读的“完整的 ssh 身份验证和加密过程假人”......
我已经在 Server Fault 上问过同样的问题,但建议在此处重新发布。