如何删除 SSH 密钥?

Posted

技术标签:

【中文标题】如何删除 SSH 密钥?【英文标题】:How can I remove an SSH key? 【发布时间】:2014-10-17 08:45:51 【问题描述】:

我目前在服务器上上传了旧的 SSH 密钥。问题是我丢失了我的~/.ssh 目录(带有原始的id_rsaid_rsa.pub 文件)。

因此,我想直接在服务器上删除旧的 SSH 密钥并上传一个新的。

我尝试了以下命令但没有成功:

$> ssh-add -D

有没有办法完全删除 SSH 密钥?

【问题讨论】:

ssh-add -d 怎么样? 该死,是ssh-add -D,大写 检查您的 ssh-agent(1) 正在使用的套接字。 【参考方案1】:

请注意,ssh-add -d/-D 至少有两个错误报告删除键:

“Debian Bug report #472477: ssh-add -D does not remove SSH key from gnome-keyring-daemon memory” “Ubuntu: ssh-add -D deleting all identities does not work. Also, why are all identities auto-added?”

确切的问题是:

ssh-add -d/-D 仅从 gnome-keyring 中删除手动添加的键。 无法删除自动添加的键。 这是最初的错误,而且肯定仍然存在。

因此,例如,如果您有两个不同的自动加载的 ssh 身份与两个不同的 GitHub 帐户(例如工作帐户和家庭帐户)相关联,则无法在它们之间进行切换。 GitHub 采用第一个匹配的,因此您始终显示为 GitHub 的“家庭”用户,无法将内容上传到工作项目。

允许ssh-add -d 应用于自动加载键(并允许ssh-add -t X 更改自动加载键的生命周期),将恢复大多数用户期望的行为。


更准确地说,关于这个问题:

罪魁祸首是gpg-keyring-daemon

它颠覆了 ssh-agent 的正常操作,主要是为了让它弹出一个漂亮的框,您可以在其中输入加密 ssh 密钥的密码。 它会遍历您的 .ssh 目录,并自动将找到的所有密钥添加到您的代理中。 而且它不会让您删除这些键。

我们怎么讨厌这个?让我们不要计算方式——生命太短暂了。

由于较新的 ssh 客户端在连接到主机时会自动尝试 ssh-agent 中的所有密钥,因此该故障更加复杂。 如果太多,服务器将拒绝连接。 而且由于 gnome-keyring-daemon 已经自行决定了您希望您的 ssh-agent 拥有多少个密钥,并且已经自动加载了它们,并且不会让您删除它们,所以您完蛋了。

直到两天前(2014 年 8 月 21 日),Ubuntu 14.04.4 中仍然确认了此错误


一种可能的解决方法:

ssh-add -D 删除您所有手动添加的密钥。这也锁定 自动添加的密钥,但没有多大用处,因为当您尝试执行 git push 时,gnome-keyring 无论如何都会要求您解锁它们。 导航到您的~/.ssh 文件夹,并将除您要识别的文件之外的所有密钥文件移动到一个名为备份的单独文件夹中。如有必要,您还可以打开 seahorse 并从那里删除密钥。 现在您应该可以毫无问题地执行git push

另一种解决方法:

您真正想要做的是完全关闭gpg-keyring-daemon。 转到System --> Preferences --> Startup Applications,然后取消选中“SSH Key Agent (Gnome Keyring SSH Agent)”框 - 您需要向下滚动才能找到它。

你仍然会得到一个ssh-agent,只是现在它会正常运行:没有自动加载密钥,你运行 ssh-add 来添加它们,如果你想删除密钥,你可以。想象一下。

This comments 实际上建议:

解决方案是让gnome-keyring-manager永远无法启动,这非常困难,最终通过删除程序文件的执行权限来实现。


Ryan Lue 增加了另一个有趣的角落案例in the comments:

如果这对任何人有帮助:我什至尝试完全删除 id_rsaid_rsa.pub 文件,但密钥仍然显示。

原来 gpg-agent 将它们缓存在 ~/.gnupg/sshcontrol 文件中;我不得不从那里手动删除它们。

当the keygrip被添加as in here时就是这种情况。

【讨论】:

Ubuntu 14-16 中的另一个选项是使用 gui 'Passwords and keys'(您可以搜索 ssh 来找到它)。选择例如 OpenSS 密钥,然后右键单击密钥并选择删除。您可能需要重新启动系统才能看到它已被删除。 为什么这个关于ssh-agentssh-add 的信息是所选答案?原贴说要remove the old SSH key directly on the server and upload a new one。听起来他想在远程主机上编辑~/.ssh/authorized_keys 这个答案让我解决了启用 ssh 转发时出现的问题。从 Ubuntu 16.04 机器到所有 ssh 凭据都被转发的 debian 系统,git clone 使用的是链中的第一个密钥,而不是 Ubuntu 框上配置文件中的版本。坏密钥被自动吸入并转发到 Debian 盒子。 这是一个真正的背部疼痛。我正在从事公司项目,并与另一家公司签约工作。这只会增加管理两者的浪费时间。我希望尽快修复! 如果这对任何人都有帮助:我什至尝试完全删除 id_rsaid_rsa.pub 文件,但关键是仍然出现。原来 gpg-agent 将它们缓存在 ~/.gnupg/sshcontrol 文件中;我不得不从那里手动删除它们。【参考方案2】:

如果您尝试执行与 SSH 相关的操作并收到以下错误:

$ git fetch
no such identity: <ssh key path>: No such file or directory

您可以使用以下命令从 SSH 代理中删除丢失的 SSH 密钥:

$ eval `ssh-agent -s`  # start ssh agent
$ ssh-add -D <ssh key path>  # delete ssh key

【讨论】:

【参考方案3】:

除非我误会了,否则您在本地计算机上丢失了包含您的私钥的 .ssh 目录,因此您想删除服务器上允许基于密钥登录的公钥。

在这种情况下,它将存储在服务器主目录中的.ssh/authorized_keys 文件中。你可以用文本编辑器编辑这个文件,如果你能识别它,删除相关的行(如果它是唯一的条目,那就更容易了!)。

我希望密钥不是您访问服务器的唯一方法,您还有其他登录和编辑文件的方法。您可以手动将新的公钥添加到authorised_keys 文件或使用ssh-copy-id。无论哪种方式,您都需要在服务器上为您的帐户设置密码验证,或使用其他身份或访问方法来访问服务器上的 authorized_keys 文件。

ssh-add 将身份添加到您的 SSH 代理,该代理在本地处理您的身份管理,并且“与代理的连接通过 SSH 远程登录转发,因此用户可以在网络中的任何位置使用身份赋予的权限一种安全的方式。” (手册页),所以在这种情况下,我认为这不是您想要的。据我所知,如果您无法通过 SSH 登录访问所述服务器,它就无法将您的公钥放到服务器上。

【讨论】:

我删除了这个文件,我仍然可以连接。所以它肯定不包含在这里......它是一个自动添加的密钥,但仍然不存在于任何地方。【参考方案4】:

检查文件夹 .ssh 是否在您的系统中

    转到文件夹 --> /Users/administrator/.ssh/id_ed25519.pub

如果不是,那么

    打开终端。

在终端中粘贴

    检查用户→ssh -T git@gitlab.com

删除现有的 SSH 密钥

    删除现有的 SSH 密钥 → rm ~/.ssh/github_rsa.pub

新建

    创建新的 SSH 密钥 → ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

    公钥已保存在“/Users/administrator/.ssh/id_ed25519.pub。”

    打开公钥保存路径。

    复制 SSH 密钥 → GitLab 帐户 → 设置 → SSH 密钥 → 添加密钥

    从终端再次测试ssh -T git@gitlab.com

【讨论】:

如果 ssh-key 用于连接远程服务器并且无法删除和生成新密钥怎么办?【参考方案5】:

我在 Unity 中打开了“密码和密钥”应用程序,并从 安全密钥 -> OpenSSH 密钥 中删除了不需要的密钥 它们也已自动从 ssh-agent -l 中删除。

【讨论】:

请注意,这也会将它们从目录~/.ssh中删除 什么是“团结”(在这种情况下)? “Unity”这个词被严重超载了。 Ubuntu Unity 还是 Ubuntu's Unity?还是别的什么? 这是唯一适用于 Ubuntu 的解决方案。【参考方案6】:

我可以确认Ubuntu 19.04 (Disco Dingo) 中仍然存在此错误。解决方法suggested by VonC 完美运行,总结为我的版本:

点击左上角的活动标签 在出现的搜索框中,开始输入“启动应用程序” 点击“启动应用程序”图标 在弹出的框中,选择 gnome 密钥环管理器应用程序(不记得 GUI 上的确切名称,但它足够独特)并将其删除。

接下来,我再次尝试ssh-add -D,重启后ssh-add -l 告诉我代理没有身份。我确认我仍然有ssh-agent 守护进程与ps aux | grep agent 一起运行。所以我添加了我最常用于 GitHub 的密钥 (ssh-add ~/.ssh/id_ecdsa),一切都很好!

现在我可以使用我最常用的存储库进行正常操作,如果我偶尔需要访问使用 RSA 密钥的另一个存储库,我只需使用export GIT_SSH_COMMAND="ssh -i /home/me/.ssh/id_rsa.pub" 为其专用一个终端。解决了!感谢 VonC 指出了错误和解决方案。

【讨论】:

【参考方案7】:

我的解决方案(openSUSE Leap 42.3、KDE)是重命名文件夹 ~/.gnupg,其中显然包含缓存的密钥和配置文件。

在 KDE 注销/登录后,ssh-add/agent 再次运行,文件夹从头开始创建,但旧密钥全部消失。

其他方法我没有成功。

【讨论】:

以上是关于如何删除 SSH 密钥?的主要内容,如果未能解决你的问题,请参考以下文章

删除 SSH 密钥终端

如何配置ssh使用密钥登录,禁止口令登录

如何在 Windows 上删除 git bash ssh 身份验证

删除具有有效 ssh 密钥的存储库

windows下如何实现ssh免密码登录

删除ssh的RSA密钥