Clloz's Blog

Back

为已有 SSH 私钥添加 Passphrase 为已有 SSH 私钥添加 Passphrase

SSH 私钥一旦泄露,没有 Passphrase 的私钥可以被直接使用。为私钥设置 Passphrase,相当于再增加一层本地保护:即使私钥文件被复制,攻击者仍需要知道 Passphrase 才能使用它。

已经在 GitHub、服务器或其他平台使用的 SSH Key,不需要重新生成。ssh-keygen 可以直接修改现有私钥的 Passphrase,并保持对应公钥不变。

确认私钥位置#

常见的 Ed25519 密钥位于:

~/.ssh/id_ed25519
~/.ssh/id_ed25519.pub
text

也可以通过 SSH 配置确认某个主机实际使用的私钥:

ssh -G example.com | rg '^identityfile'
bash

如果没有安装 rg,可以换成:

ssh -G example.com | grep '^identityfile'
bash

不要对 .pub 公钥文件执行后续操作;需要加密的是不带 .pub 后缀的私钥。

操作前记录指纹并备份#

先记录当前公钥指纹:

ssh-keygen -lf ~/.ssh/id_ed25519.pub
bash

建议在修改前制作一份临时备份,并确保只有当前用户能够读取:

cp -p ~/.ssh/id_ed25519 ~/.ssh/id_ed25519.backup
chmod 600 ~/.ssh/id_ed25519.backup
bash

备份同样是完整私钥,应该妥善保管。确认新私钥工作正常后,不要长期保留一份没有 Passphrase 的副本。

添加或修改 Passphrase#

执行:

ssh-keygen -p -f ~/.ssh/id_ed25519
bash

程序首先询问旧 Passphrase:

Enter old passphrase:
text

如果私钥之前没有 Passphrase,直接按回车。随后输入并确认新的 Passphrase:

Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
text

输入过程中终端不会显示字符,这是正常的安全行为。命令成功后,私钥文件会使用新的 Passphrase 重新加密。

如果是修改已有 Passphrase,则必须先提供正确的旧 Passphrase。遗忘旧 Passphrase 时无法从私钥中恢复它,只能改用其他仍然可用的密钥或重新生成密钥对。

验证修改结果#

从私钥导出公钥:

ssh-keygen -y -f ~/.ssh/id_ed25519
bash

如果系统要求输入 Passphrase,并在输入正确后输出公钥,说明私钥可以正常解密。也可以再次查看公钥指纹:

ssh-keygen -lf ~/.ssh/id_ed25519.pub
bash

修改 Passphrase 不会改变密钥对本身,因此公钥内容和指纹保持不变。这意味着:

  • GitHub、GitLab 或 Gitea 不需要重新上传公钥;
  • 服务器上的 ~/.ssh/authorized_keys 不需要修改;
  • 已经信任该公钥的其他设备不需要重新配置。

最后,实际连接一次常用主机,确认认证正常:

ssh example.com
bash

验证完成后,再处理操作前创建的私钥备份。

使用 ssh-agent 避免重复输入#

设置 Passphrase 后,每次直接使用私钥都可能要求输入密码。ssh-agent 可以在当前登录会话中缓存已经解锁的私钥:

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
bash

输入一次 Passphrase 后,可以查看已经加载的密钥:

ssh-add -l
bash

桌面 Linux 通常已经由登录会话启动了 agent,不一定需要手动执行 eval。可以先检查:

echo "$SSH_AUTH_SOCK"
bash

如果它输出了 socket 路径,通常可以直接运行 ssh-add

使用 macOS Keychain#

macOS 可以把 SSH 私钥的 Passphrase 保存到登录钥匙串。在 ~/.ssh/config 中加入:

Host *
    AddKeysToAgent yes
    UseKeychain yes
text

然后将私钥加入 agent 和钥匙串:

ssh-add --apple-use-keychain ~/.ssh/id_ed25519
bash

首次执行需要输入 Passphrase。之后,macOS 可以在登录钥匙串解锁时为 SSH 提供它,从而兼顾私钥加密和日常使用体验。

如果同一份 SSH 配置会在 macOS 和其他系统之间同步,其他 OpenSSH 实现可能不认识 UseKeychain。可以增加:

Host *
    IgnoreUnknown UseKeychain
    AddKeysToAgent yes
    UseKeychain yes
text

IgnoreUnknown 应放在可能不受支持的选项之前。

哪些密钥适合设置 Passphrase#

个人电脑上的交互式 SSH 私钥通常应该设置 Passphrase,尤其是经常携带、可能丢失的笔记本电脑。

自动化任务使用的密钥需要单独设计。无人值守的 CI、备份或部署任务无法在启动时人工输入 Passphrase,不应简单地把个人私钥复制过去。更合适的做法包括:

  • 为自动化任务创建单独的密钥;
  • 在服务端限制该公钥允许执行的命令和来源;
  • 使用 CI 平台的密钥管理能力;
  • 定期轮换并撤销不再使用的密钥。

Passphrase 只能保护静态存放的私钥文件。密钥被 agent 解锁后,当前会话中的恶意程序仍可能尝试使用 agent,因此系统权限、磁盘加密和设备锁屏同样重要。

总结#

为已有 SSH 私钥添加 Passphrase,只需要执行:

ssh-keygen -p -f ~/.ssh/id_ed25519
bash

这个操作只改变私钥文件的加密保护,不会改变公钥,也不会影响已经部署的公钥授权。个人设备可以配合 ssh-agent 或 macOS Keychain,减少日常使用时重复输入 Passphrase 的成本。

为已有 SSH 私钥添加 Passphrase
https://clloz.com/blog/ssh-phrase-keychain
Author Clloz
Published at May 30, 2026
Comment seems to stuck. Try to refresh?✨