不创建新密钥的情况下移除SSH密钥的密码短语

不创建新密钥的情况下移除SSH密钥的密码短语

技术背景

在使用SSH密钥进行安全认证时,为了保护密钥的安全性,通常会为其设置密码短语。然而,在某些场景下,如自动化脚本或频繁使用SSH连接时,每次输入密码短语会带来不便。因此,需要在不创建新密钥的情况下移除SSH密钥的密码短语。

实现步骤

交互式方式

使用 ssh-keygen -p 命令,该命令会提示你输入密钥文件位置、旧密码短语和新密码短语(若留空则无密码短语)。具体步骤如下:

  1. 打开终端(如Git Bash、Mac终端、Windows命令提示符等)。
  2. 输入 ssh-keygen -p 并回车。
  3. 对于密钥文件位置,可按回车使用默认位置(通常为 ~/.ssh/id_rsa)。
  4. 输入旧密码短语。
  5. 输入新密码短语时,若想移除密码短语,直接按回车留空。
  6. 再次确认新密码短语,同样按回车留空。

非交互式方式

使用 ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile] 命令,可在一行中完成操作而无需提示。但要注意,命令执行记录会以明文形式保存在 ~/.bash_history 文件中,包括密码短语,因此除非有特殊需求,建议使用交互式方式。

不同系统的特殊处理

Mac系统

  • 可将私钥的密码短语存储在钥匙串中,使使用更加透明。在 ~/.ssh/config 文件中添加 UseKeychain yes
  • 若之前设置了密码短语,可使用 ssh-add --apple-use-keychain ~/.ssh/id_rsa 命令将密钥添加到钥匙串,只需最后一次输入密码短语。

Windows系统

  • 若遇到 “id_ed25135: No such file or directory” 错误,可在命令中指定完整的密钥文件路径,如 ssh-keygen -p -f C:\Users\john\.ssh\id_ed25135
  • 也可使用PuttyGen工具加载私钥文件,移除密码短语后覆盖现有私钥文件。

核心代码

1
2
3
4
5
# 交互式方式
ssh-keygen -p

# 非交互式方式示例
ssh-keygen -p -P old_password -N "" -f ~/.ssh/id_rsa

最佳实践

  • 若需要频繁使用SSH连接,可考虑使用 ssh-agent 缓存密码短语一段时间。可在 .bash_profile (或等效文件)中添加以下代码,在登录时启动 ssh-agent
1
2
3
4
5
6
7
8
9
10
11
12
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 命令将生成的密钥复制到远程机器并添加到远程钥匙串。

常见问题

  • 命令执行记录包含密码短语:使用非交互式方式时,命令会以明文形式记录在 ~/.bash_history 文件中,建议使用交互式方式避免此问题。
  • Windows系统找不到密钥文件:可在命令中指定完整的密钥文件路径,确保路径格式正确。
  • 移除密码短语存在安全风险:移除密码短语后,任何拥有密钥文件的人都可以使用该密钥,因此需谨慎操作,可考虑使用 ssh-agent 或钥匙串来平衡安全性和便利性。

不创建新密钥的情况下移除SSH密钥的密码短语
https://119291.xyz/posts/remove-ssh-key-passphrase-without-new-key/
作者
ww
发布于
2025年5月29日
许可协议