当我尝试在 `ddev auth ssh` 之后在 DDEV 网络容器中使用 ssh 时,ssh 密钥似乎不起作用,"too many authentication failures"

When I try to use ssh in DDEV web container after `ddev auth ssh`, the ssh keys don't seem to work, "too many authentication failures"

我已经使用 ddev auth ssh 将我的 ssh 身份添加到我的 DDEV-Local 项目中。

但是当我使用 ssh 连接到外部主机时,ssh example.com 我得到 "Too many authentication failures"

Received disconnect from 174.127.116.22 port 22:2: Too many authentication failures
Disconnected from 174.127.116.22 port 22

当我使用 ssh -v example.com 时,我看到它在放弃 "Too many authentication failures" 之前尝试了六个不同的键:

debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering public key: rfay@rfay-mbp-2017.local RSA SHA256:LrokWMbl1bD0vV0z7Qpn4HLd168NYSIAbqsek6aXIaE agent
debug1: Authentications that can continue: publickey
debug1: Offering public key: rfay@rfay-mbp-2017.local RSA SHA256:ecpRhfcaRWS8EfmYyLuJ81ayhyPWAZd9MG3mKOUKMqA agent
debug1: Authentications that can continue: publickey
debug1: Offering public key: rfay@rfay-mbp-2017.local RSA SHA256:07LrVlDSWu4r+4Eb6WP8FpWYYcREw7IcGm4rtp5v+Ws agent
debug1: Authentications that can continue: publickey
debug1: Offering public key: rfay@rfay-mbp-2017.local RSA SHA256:6L9cIsLlu858CPgb5zZ3v3+5p808uNencyAxJ0S9wOM agent
debug1: Authentications that can continue: publickey
debug1: Offering public key: rfay@rfay-mbp-2017.local RSA SHA256:HwksLkZqEXAK6Zo21+y/C508Mjx2I7EvUQWFScKHsAQ agent
debug1: Authentications that can continue: publickey
debug1: Offering public key: rfay@rfay-mbp-2017.local RSA SHA256:dsGaELF0OPNyQfIYZoEyI+dP3AQqh5r+15iUwfalNtc agent
Received disconnect from 174.127.116.75 port 22:2: Too many authentication failures
Disconnected from 174.127.116.75 port 22

我该如何解决这个问题?请注意,我的 ~/.ssh 目录中有 10 个不同的私钥。

似乎 ssh 并不是为使用大量私钥而设计的,但有些人最终还是得到了很多私钥。 (请注意,您可以将一个私钥用于很多很多目的;您与世界或外部服务共享的只是 public 密钥,它不会泄露关于私钥的任何信息。)

由于 ddev auth ssh 正在为您设置一个 ssh 代理,而且似乎没有办法让 ssh 从该代理提供的身份中选择一个特定的身份,您需要使用两种解决方法之一。

解决方法 #1:只使用几个键

当然,您可以将 ~/.ssh 目录中的密钥数量减少到 6 个或更少(6 是 MaxAuthTries 服务器端 sshd 中的默认值)。但假设您不想那样做。

创建一个目录,也许~/ddev-ssh-keys。在该目录中,复制或符号链接您最常使用的 6 个键。所以 cd ~/ddev-ssh-keys && for item in goodkey1 goodkey2 ... googdkey6; do ln -s ~/.ssh/$item; done(或您想要完成链接或复制的任何方式)。

现在 ddev auth ssh -d ~/ddev-ssh-keys 和 ddev-ssh-agent 将只有这 6 个密钥。如果它们是解决大部分问题的正确方法,那么您应该很擅长这种方法。

解决方法 #2:使用 .ddev/homeadditions

将密钥复制到容器中

此变通方法可让您实际将所需的密钥复制到 Web 容器中。这可能不如第一种方法安全(因为你永远不应该真正在任何地方复制你的私钥),但它有效。

如果您真的想要容器中的密钥(而不是使用代理),那么 mkdir -p .ddev/homeadditions/.ssh && cp ~/.ssh/<yourimportantkey(s)> .ddev/homeadditions/.ssh && chmod 700 .ddev/homeadditions/.ssh && chmod 600 .ddev/homeadditions/.ssh/*。然后,您可以按任何方式使用 .ddev/homeadditions/.ssh/config 文件,包括指定密钥。

此答案改编自https://github.com/drud/ddev/pull/2224

这是 rfay 解决方法 #2 的扩展,以使其更安全。您可以使用密钥对的 public 部分来指定要从 ssh 代理使用哪个私钥。因此,不要将您的私钥复制到 .ddev/homeadditions/.ssh 文件夹中,只需复制公钥即可。例如,mkdir -p .ddev/homeadditions/.ssh && cp ~/.ssh/*.pub .ddev/homeadditions/.ssh && chmod 700 .ddev/homeadditions/.ssh && chmod 600 .ddev/homeadditions/.ssh/*.

从技术上讲,您甚至不需要 'chmod 600' 密钥文件,因为它们是公钥,但它确实增加了一些安全性。

然后您可以在命令行上指定要使用的密钥:

ssh -i ~/.ssh/id_rsa.pub example@example.com

ssh -o IdentityFile=~/.ssh/id_rsa.pub example@example.com

或者您可以在 .ssh/config 文件中指定 IdentityFile。