如何在不创建新密钥的情况下删除SSH密钥的密码保护?

1536

我在创建新的SSH密钥时设置了一个密码短语。但是,现在我意识到,当你在一小时内多次尝试通过SSH提交(GitSVN)到远程位置时,这会非常麻烦。

我能想到的一种方法是删除我的SSH密钥并创建新的密钥。是否有一种方式可以删除密码短语,同时仍然保持相同的密钥?


13
我认为严格来说,Torsten Marek的回答才是正确的。ssh-agent的技巧可能是你在寻找的,但它是针对不同问题的答案。 - tardate
1
口令短语不仅是解锁私有SSH密钥的关键,而且是加密机制的一部分。其中一部分是您的SSH密钥,另一部分是手动输入的口令短语。只有当两个部分都正确时,从它们即时生成的组合密钥才有效。因此,其他口令短语对应于其他SSH密钥(没有口令短语是“其他口令短语”的特殊情况)。 - Paul
142
关闭此类问题就像辩论编程语言中是否应该允许副作用一样,纯粹主义者总是蛮不讲理的,而其他人则不在乎,因为这是一个有用的特性,可以使生活更轻松。虽然它与编程没有直接关系,但仍需要ssh,请不要关闭此类问题。:| - sjas
我同意,这很痛苦,我每天都会遇到多次。不过有时候,在实际推送之前,它给了我最后一次查看我正在推送的内容的机会。我发现这个小命令行修改很有帮助:https://coderwall.com/p/fasnya/add-git-branch-name-to-bash-prompt - David
一个更好的解决方案是使用ssh代理(或keychain等)来存储您的会话凭据,而不是完全删除密码。这样,您只需输入一次密码即可,而不是每次都需要输入。以下是在Windows中执行此操作的方法:https://dev59.com/fHRC5IYBdhLWcg3wOeWB#58784438 - Casey Kuball
11个回答

2792

简短回答:

$ ssh-keygen -p

接下来会提示您输入密钥文件位置、旧的口令和新的口令(可以留空,表示不设置口令)。


如果您想一行完成而不需要提示,请执行以下操作:

$ ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]

重要提示:注意,执行命令时它们通常会以明文形式记录在您的~/.bash_history文件(或类似文件)中,包括所有提供的参数(即本例中的口令)。因此,建议您除非有特定原因,否则使用第一个选项。

请注意,尽管您可以仍然使用-f keyfile而无需指定-P-N,并且密钥文件默认为~/.ssh/id_rsa,因此在许多情况下,密钥文件甚至都不是必需的。

您可能希望考虑使用ssh-agent,它可以缓存口令一段时间。最新版本的gpg-agent也支持ssh-agent使用的协议。


499
明确一下:您只需在终端中运行“ssh-keygen -p”命令。然后会提示您选择密钥文件(默认为正确的文件,对于我来说是“〜/ .ssh / id_rsa”),输入旧的密码短语(输入当前的密码)和新的密码短语(不输入任何内容)。 - Henrik N
51
当您运行此命令时:ssh-keygen -p -P oldpassphrase -N "" -f ~/.ssh/id_rsa,它将会更改您在本地计算机上保存的SSH私钥文件的密码。 - Fedir RYKHTIK
33
不要让用户在终端中输入密码并通过“~/.bash_history”进行访问。最好键入:“$ cd ~/.ssh && ssh-keygen -f id_dsa -p ” - betoharres
22
请注意,如果您在 shell 中输入命令时前面有一个空格,该命令将不会被记录到 ~/.bash_history 中。例如,使用 ssh-keygen -p -P oldpassphrase -N "" -f ~/.ssh/id_rsa 就可以避免记录(除非您的计算机存在其他键盘记录软件)。您也可以通过删除历史记录中的单个行来解决这个问题。 - Huge
19
也许值得在其中添加一行说明,这将覆盖现有文件而不提示选择新位置。 - Lars Francke
显示剩余10条评论

112

$ ssh-keygen -p 对我很有用

打开git bash,粘贴:$ ssh-keygen -p

按回车键使用默认位置。

输入旧的密码短语

输入新密码短语-空白

确认新密码短语-空白

太好了,现在可以不必为git push输入密码短语而烦恼了。

谢谢!


1
如果在输入 $ ssh-keygen -p 并且您的密钥不在默认位置(例如 /Users/yourname/.ssh/id_rsa),当提示时,您可以回复 /Users/yourname/.ssh/yourkey - Chigozie Orunta
1
不是非常安全的做法。root可以在没有口令的情况下使用您的密钥。 - bbaassssiiee
6
轰隆声,你的密钥现在不再安全。 - mikep
14
"root可以在不需要口令的情况下使用你的密钥",请将其添加到所有“安全违规”清单中...如果有恶意人士获得了root权限,你会遇到更严重的麻烦。 - user4945014
@bbaassssiiee 但是如果有人拥有管理员权限,他们也可以安装键盘记录器并获取你输入的密码短语,所以很可能管理员无论如何都会获得你的密钥。更值得考虑的情景是机器被盗,而没有进行完全磁盘加密。盗贼将能够访问并推送到代码库。键入密码短语所需的额外工作可能或可能不值得用来增加对这种情况的缓解的额外安全性,这一切取决于你的上下文。 - Azendale

50
你可能想要将以下内容添加到你的 .bash_profile 文件(或等效文件),它会在登录时启动 ssh-agent。
if [ -f ~/.agent.env ] ; then
    . ~/.agent.env > /dev/null
    if ! kill -0 $SSH_AGENT_PID > /dev/null 2>&1; then
        echo "Stale agent file found. Spawning new agent… "
        eval $(ssh-agent | tee ~/.agent.env)
        ssh-add
    fi 
else
    echo "Starting ssh-agent"
    eval $(ssh-agent | tee ~/.agent.env)
    ssh-add
fi

在一些Linux发行版(如Ubuntu、Debian)上,你可以使用以下命令:
ssh-copy-id -i ~/.ssh/id_dsa.pub username@host

这将把生成的ID复制到远程机器,并将其添加到远程钥匙串。
你可以在这里阅读更多这里这里

7
现代发行版默认会启动ssh-agent吗? - Troels Arvin
1
在某些Linux发行版(Ubuntu、Debian)上,您可以使用以下命令:ssh-copy-id -i ~/.ssh/id_dsa.pub username@host当然,前提是您可以以该方式访问。虽然这个命令是从2008年开始的,但是它应该被编辑为id_rsa.pub(是的,我可以编辑它,但我不想对别人的作品做出这样的修改,特别是对于这样的东西)。 - Pryftan
@TroelsArvin 是的。但另一方面,有时它会被终止(尽管我遇到的情况不在脑海中 - 除非可能X11出了问题,你必须重新启动它...那可能是这样的一个例子)。在这种情况下,您确实需要“重新创建”它。 - Pryftan
如果你将你的密钥加载到ssh-agent中,那么这个命令会将它们分发给其他主机: ssh-copy-id user@host - bbaassssiiee

27

要更改或删除密码,我经常只传递 pf 标志,然后让系统提示我提供口令:

ssh-keygen -p -f <name-of-private-key>

例如:

ssh-keygen -p -f id_rsa

如果您想删除密码,请输入空密码。

要删除或更改密码的示例运行如下所示:

ssh-keygen -p -f id_rsa
Enter old passphrase: 
Key has comment 'bcuser@pl1909'
Enter new passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved with the new passphrase.

当向一个没有密码的密钥添加密码短语时,运行应该是这样的:

ssh-keygen -p -f id_rsa
Key has comment 'charlie@elf-path'
Enter new passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved with the new passphrase.

12

Mac上,您可以将私有ssh密钥的密码短语存储在Keychain中,这使其使用变得透明。如果您已登录,则可用;如果您退出登录,则无法使用根用户。删除密码短语是一个坏主意,因为任何拥有该文件的人都可以使用它。

ssh-keygen -K

将以下内容添加到 ~/.ssh/config 文件中

UseKeychain yes

7
在 Windows 中,当我输入上述命令时,它一直显示 "id_ed25135:没有这样的文件或目录"。因此,我进入了文件夹,在文件夹资源管理器中复制了路径,并在末尾添加了 "\ id_ed25135"。
这是我最终输入并成功的内容:
ssh-keygen -p -f C:\Users\john\.ssh\id_ed25135
这个方法可行。因为在 Cmder 中,默认路径类似于 C:\ Users \ capit / .ssh / id_ed25135(有些是反斜杠:“\”,有些是正斜杠:“/”)。

7
在Windows上,您可以使用PuttyGen加载私钥文件,删除密码短语,然后覆盖现有的私钥文件。

5

针对Windows系统;

  1. 打开cmd窗口,输入以下内容并按下回车键。

    ssh-keygen -p

  2. cmd会要求您输入旧密码短语。输入您的旧密码短语并按回车键。在输入时无法看到旧密码短语。

  3. cmd会要求您输入新密码短语及其确认。您可以将其留空。

恭喜!!!


2
对于我在Mac上,以下步骤解决了这个问题。
1. 打开终端,进入用户目录,并输入以下命令。
ssh-keygen -p

2> 它会要求您
输入密钥所在的文件(/Users/your user name/.ssh/id_rsa): 提供括号中显示的文件路径。
3> 然后它会要求您输入旧的密码短语。输入您的旧密码短语并按回车键。当您输入密码短语时,终端不会显示任何内容。
4> 然后它会要求您输入新的密码短语
输入新密码短语(留空表示没有密码短语) 如果您不想保留任何密码短语,只需按回车键即可。
5> 然后它会再次要求您确认相同的密码短语
再次输入相同的密码短语 然后再次按回车键。
6> 然后您将收到成功消息
您的身份验证已保存,并使用新的密码短语。

0
如果您之前设置了密码短语并且正在使用 Mac,请改用钥匙串,您只需要输入最后一次密码短语即可。
ssh-add --apple-use-keychain ~/.ssh/id_rsa
Enter passphrase for /Users/{{user_name}}/.ssh/id_rsa:
Identity added: /Users/{{user_name}}/.ssh/id_rsa(/Users/{{user_name}}/.ssh/id_rsa)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接