題 如何使用SSH密鑰使用Mac OS X Keychain?


據我所知,自Mac OS X Leopard以來,Keychain支持存儲SSH密鑰。有人可以解釋這個功能應該如何工作。

我有一些RSA密鑰,我已生成存儲在〜/ .ssh目錄中,用於訪問各種服務器。我沒有在這些鍵上設置密碼。目前,為了登錄這些服務器,我在終端中使用以下命令:

eval`ssh-agent`
ssh-add~ / .ssh / some_key_rsa
ssh user @ server

(我寫了一些Bash函數來使這更容易。)

使用鑰匙串有更好的方法嗎?


133
2017-12-28 12:08


起源




答案:


為了它的工作, $SSH_AUTH_SOCK 應該指出環境變量 /tmp/launch-xxxxxx/Listeners。這應該在您登錄時自動完成。該套接字上的偵聽器說出ssh-agent協議。

你的bash腳本正在啟動你自己的ssh代理(拼寫 ssh-agent,而不是ssh_agent)並覆蓋現有的 ssh-agent 這是在登錄時為您設置的。

此外,鑰匙串的重點是將密碼存儲到您的ssh密鑰,但是您說您沒有在這些密鑰上設置密碼,因此我不確定您對密鑰鏈集成的期望是什麼。

最後,當您第一次登錄時,您可能不會看到ssh-agent進程。當第一次嘗試讀取該套接字時,該過程將由啟動服務自動啟動 /tmp


16
2017-12-28 17:37



謝謝。所以我還是要跑 ssh-add 將我的RSA身份添加到登錄時啟動的默認ssh代理? - John Topley
您不必運行ssh-add; ssh-agent將在您第一次運行ssh時詢問密鑰的密碼。 - Rudedog
每次運行ssh時它都會提示我輸入密碼。關鍵是我不想輸入任何密碼。 - John Topley
是什麼提示您輸入密碼?我開始懷疑它是提示你的遠程服務器,這使你的聲明表明你的密鑰沒有更好的透視密碼。如果要繞過遠程服務器上的密碼,則需要將公鑰添加到 $HOME/.ssh/authorized_keys 在那台服務器上。 Mac OS的ssh-agent + keychain僅用於存儲本地ssh密鑰的密碼;它並不意味著通過現有的ssh連接發送遠程密碼。 - Rudedog
使用 ssh -v 診斷ssh正在做什麼。也用 sshd -p 8900 -v 在服務器端和 ssh -v remote:8900 診斷sshd正在做什麼。 - Rudedog


截至OS X的Leopard版本,ssh-agent與Keychain的關係更緊密。可以將所有SSH密鑰的密碼安全地存儲在Keychain中,ssh-agent將在啟動時讀取它們。最重要的是,使用密碼保護密鑰很簡單,但永遠不必輸入密碼來使用密碼!方法如下:

將密碼鏈中的密碼添加到每個ssh密鑰:(選項-k僅加載普通私鑰,跳過證書)

ssh-add -K [path/to/private SSH key]

(注意這是大寫字母K)

無論何時重啟Mac,都會自動加載鑰匙串中的所有SSH密鑰。您應該能夠在Keychain Access應用程序中以及命令行中通過以下方式查看密鑰:

ssh-add -l

245
2018-04-11 19:58



這應該是公認的答案。 - Kris
接受的答案回答了這個特定用戶的問題,但這回答了通用用戶的問題 - eqzx
developer.apple.com/library/mac/documentation/Darwin/Reference/...  您還需要-K選項來存儲鑰匙串中的密碼短語。 - Neeme Praks
如果您通過像Homebrew這樣的軟件包系統安裝了另一個版本的SSH,那麼必須使用類似的絕對路徑 /usr/bin/ssh-add。 - Ludovic Kuty
對於macOS Sierra來說,情況發生了變化。看到 github.com/jirsbek/SSH-keys-in-macOS-Sierra-keychain - schieferstapel


作為 macOS SierraSSH代理 登錄帳戶時,不再自動加載以前加載的ssh密鑰。這是蘋果的故意,他們希望重新與主流保持一致 OpenSSH的 實現。 [1]


如上所述 這裡,這是推薦的方法,因為 macOS 10.12.2

  1. 將以下行添加到您的 ~/.ssh/config 文件:

    Host *
        UseKeychain yes
        AddKeysToAgent yes
    
  2. 你添加的任何鍵 SSH代理 使用 ssh-add /path/to/your/private/key/id_rsa 命令將自動添加到鑰匙串中,並應在重新啟動時自動加載。


不推薦使用以下內容(保留以供參考)。

要回到以前的行為,您需要運行 ssh-add -A 登錄時命令(自動加載所有在密鑰鏈上都有密碼短語的ssh密鑰)。為此,請按照下列步驟操作:

  1. 首先,添加要自動加載到的所有鍵 SSH代理 使用 ssh-add -K /absolute/path/to/your/private/key/id_rsa 命令。該 -K 參數確保添加密鑰密碼短語 macOS的鑰匙串。確保使用密鑰的絕對路徑。使用相對路徑將使自動啟動的腳本無法找到您的密鑰。

  2. 鍵入時確保所有鍵都顯示為已添加 ssh-add -A

  3. 創建一個名為的文件 com.yourusername.ssh-add.plist 在 ~/Library/LaunchAgents/ 以下內容。 Plist文件 比如這個用的是 launchd 登錄時運行腳本。 [2]  [3]

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
    <key>Label</key>
      <string>com.user.loginscript</string>
    <key>ProgramArguments</key>
      <array>
        <string>ssh-add</string>
        <string>-A</string>
      </array>
    <key>RunAtLoad</key>
      <true/>
    </dict>
    </plist>
    
  4. 告訴 launchd 加載 plist文件 你剛剛通過執行創建: launchctl load ~/Library/LaunchAgents/com.yourusername.ssh-add.plist

你應該全力以赴。


73
2017-12-12 18:17



有關: apple.stackexchange.com/questions/48502/... - slm


有一種比簡單的方法 里卡多的回答 在運行10.12 Sierra的Mac的會話/重啟之間保留密碼。

  1. ssh-add -K ~/.ssh/id_rsa
    注意:更改id_rsa鍵所在的路徑。
  2. ssh-add -A 
  3. 創建(或編輯,如果存在)以下內容 ~/.ssh/config 文件:

    Host *
      UseKeychain yes
      AddKeysToAgent yes
      IdentityFile ~/.ssh/id_rsa
    

    現在重啟之間會記住密碼!

Apple特意改變了macOS 10.12 Sierra中ssh-agent的行為,不再自動加載以前的SSH密鑰,如下所述 OpenRadar推特討論,和 Apple的技術說明。上面的解決方案將模仿El Capitan的舊行為並記住您的密碼。


29
2018-01-05 18:53



真棒,像魅力一樣,imho比其他人更清潔,並在正確的地方解決:) - GerardJP


注意:對於macOS Sierra,請參閱最新版本 由ChrisJF回答

[Jeff McCarrell的回答] [2]是正確的,除了添加密碼短語的命令包含一個短劃線而不是一個連字符,即 –K 代替 -K,導致消息的效果 –K: No such file or directory。 它應該是:

ssh-add -K [path/to/private SSH key]

9
2018-04-28 13:28



這應該是對你提到的答案的評論,而不是一個新的答案。我們在這裡談論安全問題。有人可能會建議你小心打字,而不是盲目地複制和粘貼 ssh-add -K - Phil_1984_
使用帶有K的連字符,我得到了 illegal option -- K。小寫字母k作為選項列出。 - Sam Dutton
感謝您的反饋。我剛剛檢查了macOS Sierra: -K,即破折號資本K,仍然有效 - simonair


我懷疑你沒有使用默認值 ssh 命令。你有沒有 ssh 通過端口安裝?嘗試 which ssh 看哪個 ssh 你正在使用的命令。

通常它應該顯示一個對話框,詢問您密碼,如果它尚未存儲在您的鑰匙串中。


6
2017-12-28 12:55



我沒有使用端口。 - John Topley
感謝您的信息:)我有問題,因為我在Homebrew使用OpenSSH。 - ggustafsson


嘗試使用客戶端ssh證書登錄時遇到了類似的問題。在這種特定情況下,它用於訪問git存儲庫。情況就是這樣:

  • 密鑰保存在 ~/.ssh/
  • 私鑰有密碼。
  • 密碼短語存儲在OS X登錄密鑰鏈中。 ~/Library/Keychains/login.keychain
  • 連接如下:我的mac -> 遠程mac -> git / ssh服務器
  • Mac OS X 10.8.5

當我使用遠程桌面連接到遠程mac時,我沒有遇到任何問題。但是,當使用SSH連接到遠程mac時,我每次都被要求輸入ssh密碼。以下步驟為我解決了這個問題。

  1. security unlock-keychain 密碼短語存儲在登錄密鑰鏈中。這將解鎖它並使ssh-agent能夠訪問它。
  2. eval `ssh-agent -s` 啟動ssh-agent以供shell使用。它將從鑰匙串獲取密碼並使用它來解鎖私有ssh密鑰。
  3. 建立ssh / git連接並完成我的工作。
  4. eval `ssh-agent -k` 殺死正在運行的ssh-agent。
  5. security lock-keychain 再次鎖定鑰匙串。

6
2017-10-14 12:29



為了讓#2在別名中為我工作,我不得不使用 eval \$(ssh-agent) 每 Re:遠程登錄和鑰匙串。不在別名範圍內時 eval $(ssh-agent) 工作(沒有反斜杠$)。 - Travis


也可以看看:

security import priv_key.p12 -k ~/Library/Keychains/login.keychain
security import pub_key.pem -k ~/Library/Keychains/login.keychain

...添加此註釋,要求提供更多詳細信息: “security”命令能夠將密鑰(和其他東西)直接導入Keychains。好消息是,與ssh-add不同,您可以指定鑰匙串。這樣就可以直接導入系統Keychain(“man security”來學習如何)


4
2018-03-26 09:45



你能給這個答案多一點細節嗎?謝謝。 - Matthew Williams