macOS默认的SSH存储公钥密码

2024-01-06
#Unix

1. 前言

自从更新 macOS 的 SSH 后1,每次用 SSH 时,都被要求输入公钥密码,如:

ssh -T git@github.com

# 显示
Enter passphrase for key …

一般地,输入一次后,后面都不需要输入公钥密码。

但是,重启电脑后,还是需要再次输入公钥密码。

一种思路是:在创建私钥和公钥时,设置公钥密码为空。不过,不推荐这种方法,因为不安全。

另外一种思路是:还原 macOS 默认的 SSH ,并进行 keychain 设置。

2. 删除 brew 安装的 openssh 版本 SSH

brew remove openssh
Uninstalling /opt/homebrew/Cellar/openssh/9.6p1... (45 files, 6.4MB)

3. 设置苹果默认 SSH 的 keychain

通过终端查询苹果默认的 ssh-add: man ssh-add (macOS 13.6; February 4, 2022),发现有以下两个功能:

--apple-use-keychain
    When adding identities, each passphrase will also be stored in the user's keychain.
    When removing identities with -d, each passphrase will be removed from it.

--apple-load-keychain
    Add identities to the agent using any passphrase stored in the user's keychain.

注意⚠️:ssh-add --apple-use-keychain --apple-load-keychain 是 macOS 系统特有的。用 brew install openssh 安装的 OpenSSH 没有这个功能。

第一步,添加 keychain:

/usr/bin/ssh-add --apple-use-keychain ~/.ssh/id_ed25519_name

第二步,使用 keychain,以下内容加入 ~/.zshrc 文件 :

# ssh apple-keychain 06.Jan.2024
# Add my keys to the ssh agent; passwords are pulled from the keychain.
# The --apple-load-keychain option is unique to MacOS.
/usr/bin/ssh-add --apple-load-keychain 2> /dev/null

注意⚠️:2> /dev/null 的作用是不显示过程文字 Identity added: /Users/name/.ssh/id_ed25519_name ...

第三步,配置 SSH ,在 ~/.ssh/config 文件里加入以下内容:

Host *
  AddKeysToAgent yes
  IgnoreUnknown UseKeychain
  UseKeychain yes
  IdentityFile ~/.ssh/id_ed25519_name

经过以上三步,SSH 公钥密码就被存储在用户的 keychain 里。

每次重启电脑并打开终端时,会自动加载 keychain 里存的公钥密码;而后, SSH 就能访问用户的 keychain 里存的公钥密码,避免了每次都要输入公钥密码的情形。

4. 延伸阅读

  1. macOS更新SSH
  2. Error: ssh-add: illegal option – apple-use-keychain - GitHub Enterprise Server 3.10 Docs
  3. Adding your ssh keys to MacOS Keychain – Domain of the Technomancer
  4. How can I permanently add my SSH private key to Keychain so it is automatically available to ssh? - Ask Different