如何替换 ssh 公私密钥对?

pil*_*eup 4 ssh

如果我觉得我的原始 ssh 被泄露了,因为有人拥有密码,我是否需要替换私钥和公钥对,还是只更改密码?哪一个是解决方案,我该怎么做?

谢谢

Lie*_*tok 6

如果您知道某人拥有密码,他可能使用了您的 ssh 密钥。如果是这种情况,您可能无法知道该人是否复制了您的 ssh 密钥。如果此人拥有您的密钥的副本并且您更改了密钥上的密码,则该副本显然仍使用旧密码,因此该人可以使用。因此,为了安全起见,我建议更换您的 ssh 密钥。

您可以通过运行生成新密钥

ssh-keygen -f ~/.ssh/new-key
Run Code Online (Sandbox Code Playgroud)

这将在~/.ssh/new-key.

不要忘记不仅要创建一个新密钥,还要从所有拥有它的机器中删除旧密钥。

更新:为此,首先列出您可以使用该 ssh 密钥访问的所有机器。然后,对于这些机器中的每一个,执行以下操作:

user@local:~$ ssh someuser@somemachine
someuser@somemachine:~$ nano .ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)

编辑该文件并执行以下操作:

  1. 删除包含旧 ssh 密钥的行。如果只有一行是简单的,如果不是,请查找以与旧公钥相同的神秘字母结尾的行。您可以通过cat ~/.ssh/id_rsa.pub在本地机器上执行来查看您的旧公钥(假设您的旧密钥是 id_rsa,否则您必须调整命令)。要删除 中的一行nano,只需按Ctrl+ K
  2. 将您的新公钥添加到该文件中。您可以使用cat ~/.ssh/new-key.pub. 将整行逐字复制到文件中。
  3. 保存按文件Ctrl+ OEnterCtrl+X退出nano

然后测试您是否可以在不关闭现有连接的情况下使用新密钥访问机器(因此如果出现问题,您仍然可以连接)。

user@local:~$ ssh -i ~/.ssh/new-key someuser@somemachine
Run Code Online (Sandbox Code Playgroud)

如果这有效并且您已连接到远程机器,则您已成功替换了该机器上的 ssh 密钥。现在继续下一台机器。重复直到完成。

您可以稍微自动化整个过程:

ssh-copy-id -i ~/.ssh/new-key.pub someuser@somemachine
ssh -i ~/.ssh/new-key someuser@somemachine "sed -i.bak 's/$(cut -f2 ~/.ssh/id_rsa.pub | sed 's~/~\\/~g')/d' ~/.ssh/authorized_keys"
Run Code Online (Sandbox Code Playgroud)

但是我不保证这会起作用并且不会将您锁定在某些机器之外。使用风险自负!

它的作用是ssh-copy-id复制您的新密钥并sed用于从authorized_keys文件中删除旧密钥。$(cut -f2 ~/.ssh/id_rsa.pub | sed 's~/~\\/~g')将您的旧公钥添加到命令中,以便它能够搜索它并注意转义斜杠。/some-string/d从文件中删除所有匹配字符串的行(在我们的例子中是你的旧密钥)。

仅当您有很多机器要更改密钥并首先在您可以物理访问的机器上进行测试时才这样做,或者在出现问题时以其他方式恢复访问。更新结束

更换旧密钥后,您可以将密钥重命名为,~/.ssh/id_rsa以便ssh自动找到它。您可能希望保留旧密钥的备份,以防您忘记了一个您将无法再访问的系统。

更新:为此,只需运行:

cd ~/.ssh
mv id_rsa id_rsa_old
mv id_rsa.pub id_rsa_old.pub
mv new-key id_rsa
mv new-key.pub id_rsa.pub
Run Code Online (Sandbox Code Playgroud)

如果您需要再次使用旧密钥做某事,您可以ssh -i ~/.ssh/id_rsa_old使用它。不要忘记将新密钥添加到该机器并删除旧密钥。