SSH Key 管理
產生 SSH Key
首先輸入指令來產生 key:
ssh-keygen
接著會詢問產生的 SSH key 要存放的位置。
預設為 /home/username/.ssh/id_rsa,如果不同伺服器會使用不同的 key,則改變 key 的位置(例如:/home/username/.ssh/id_rsa_ubuntu)。
id_rsa id_rsa.pub <= 把這個東西打開 known_hosts
cat id_rsa.pub
再把公 key copy 下來。
參考文章
macOS:不用一直輸入 passphrase
適用情境:你用 git pull、git push 等指令時,Terminal 一直問:
Enter passphrase for key '/Users/你的帳號/.ssh/id_ed25519_xxx':
這代表私鑰有設 passphrase(這是好事,丟了 key 別人也不能直接用),但 macOS 預設不會把 passphrase 長期記住,重開機或新開 session 後又會再問一次。
解法是把 passphrase 存進 Apple Keychain,之後由系統自動解鎖,不必每次手動輸入。
第一步:設定 ~/.ssh/config
編輯(或新建)~/.ssh/config,在檔案最上方加入:
Host *
AddKeysToAgent yes
UseKeychain yes
| 選項 | 作用 |
|---|---|
UseKeychain yes | 告訴 SSH 從 macOS Keychain 讀取 / 儲存 passphrase |
AddKeysToAgent yes | 第一次使用時自動把 key 加進 ssh-agent |
Host * 這段建議放在檔案最上面。SSH 由上往下讀取,較具體的 Host 規則通常寫在後面覆寫。
若你會把同一份 config 同步到 Linux,Linux 不認識 UseKeychain,可在前面加:
Host *
IgnoreUnknown UseKeychain,AddKeysToAgent
AddKeysToAgent yes
UseKeychain yes
第二步:把 key 存進 Keychain(只需做一次)
對每一把有 passphrase 的私鑰執行(macOS Monterey 12+):
ssh-add --apple-use-keychain ~/.ssh/id_ed25519_xxx
輸入最後一次 passphrase。成功後,macOS 會把 passphrase 存進 Keychain;之後 git pull / git push / ssh 就不會再一直問。
多把 key 就各執行一次:
ssh-add --apple-use-keychain ~/.ssh/id_ed25519_personal
ssh-add --apple-use-keychain ~/.ssh/id_ed25519_company
請使用系統內建的 /usr/bin/ssh-add。若你用 Homebrew 安裝了 OpenSSH,ssh-add 可能指向 Homebrew 版本,不支援 --apple-use-keychain。不確定時用完整路徑:
/usr/bin/ssh-add --apple-use-keychain ~/.ssh/id_ed25519_xxx
第三步(可選):開新 Terminal 自動從 Keychain 載入
若重開機或新開 shell 後又偶發被問 passphrase,可在 ~/.zshrc 加上:
ssh-add --apple-load-keychain -q 2>/dev/null
-q 可抑制每次開 Terminal 印出 Identity added: ... 的訊息。
驗證
# 確認 key 已在 agent 裡
ssh-add -l
# 測 GitLab / GitHub(不應再問 passphrase)
ssh -T git@gitlab.com -i ~/.ssh/id_ed25519_xxx -o IdentitiesOnly=yes
ssh -T git@github.com -i ~/.ssh/id_ed25519_xxx -o IdentitiesOnly=yes
預期不會再出現 Enter passphrase for key ...;若遠端已登記公鑰,會看到歡迎訊息。
和「多把 key」一起用時
Keychain 只解決「不用一直輸入 passphrase」。若 ~/.ssh/ 底下有多把 key,仍建議搭配本文後面的 IdentitiesOnly=yes(單一 repo 的 core.sshCommand,或 ~/.ssh/config 的 IdentityFile),避免 SSH 亂試 key 而出現 Too many authentication failures。