題 使用多個SSH公鑰


我在Unfuddle上有個人帳戶和公司帳戶。在Unfuddle上SSH密鑰只能在一個帳戶上使用,因此我需要在筆記本電腦上為這兩個帳戶創建一個單獨的SSH密鑰。我跑了 ssh-keygen -t rsa 生成兩個具有不同名稱的密鑰(個人是默認名稱,公司是{company} _rsa)。現在的問題是,似乎我的默認密鑰在任何地方都使用,我無法找到如何指定在Git中用於個人回購的密鑰。

所以我的問題是:如何指定在repo-to-repo基礎上使用的SSH密鑰?

我設置了我的ssh_config(〜/ .ssh / config),但它似乎仍然不起作用。

配置:

Host {personalaccount}.unfuddle.com
     HostName {personalaccount}.unfuddle.com
     User git
     IdentityFile /Users/dave/.ssh/id_rsa

Host {companyaccount}.unfuddle.com
     HostName {companyaccount}.unfuddle.com
     User git
     IdentityFile /Users/dave/.ssh/cage_rsa

我的公司unfuddle帳戶上的回購的我的Git repo配置文件如下所示:

[remote "origin"]
     url = git@{companyaccount}.unfuddle.com:{companyaccount}/overall.git
     fetch = +refs/heads/*:refs/remotes/origin/*

所以我不確定我的ssh配置或我的git配置是否有問題。


94
2018-04-18 13:26


起源


你的ssh配置看起來正確,我正在使用類似的配置。 - Paŭlo Ebermann


答案:


如果你有一個活躍的 SSH代理 有你的 id_rsa 密鑰加載,然後問題很可能 SSH 首先提供這個關鍵。 Unfuddle可能接受它進行身份驗證(例如,在 sshd的但拒絕授權訪問公司存儲庫(例如,他們用於授權的任何內部軟件,可能類似於Gitolite)。也許有一種方法可以將您的個人密鑰添加到公司帳戶(多個人不共享相同的密鑰) corp_rsa 公鑰和私鑰文件,是嗎?)。


IdentitiesOnly  .ssh/config 配置關鍵字可用於限制密鑰 SSH 提供遙控器 sshd的 到那些指定的通過 IdentityFile 關鍵字(即它將拒絕使用碰巧加載到活動中的任何其他密鑰 SSH代理)。

試試這些 .ssh/config 部分:

Host {personalaccount}.unfuddle.com
     IdentityFile ~/.ssh/id_rsa
     IdentitiesOnly yes

Host {companyaccount}.unfuddle.com
     IdentityFile ~/.ssh/{companyaccount}_rsa
     IdentitiesOnly yes

然後,使用這樣的Git URL:

git@{personalaccount}.unfuddle.com:{personalaccount}/my-stuff.git
git@{companyaccount}.unfuddle.com:{companyaccount}/their-stuff.git

如果你想充分利用 .ssh/config 機制,您可以提供自己的自定義主機名並更改默認用戶名:

Host uf-mine
     HostName {personalaccount}.unfuddle.com
     User git
     IdentityFile ~/.ssh/id_rsa
     IdentitiesOnly yes

Host uf-comp
     HostName {companyaccount}.unfuddle.com
     User git
     IdentityFile ~/.ssh/{companyaccount}_rsa
     IdentitiesOnly yes

然後,使用這樣的Git URL:

uf-mine:{personalaccount}/my-stuff.git
uf-comp:{companyaccount}/their-stuff.git

108
2018-04-19 03:21



如果在同一個Unfuddle子域(具有不同的SSH密鑰)上有多個帳戶,則需要使用第二種方法。 - leolobato
在我的gitolite設置中,IdentitiesOnly對我來說至關重要,謝謝! - Koen.
很棒,這解決了我的所有密鑰被發送到github的問題。但是,在OS X上我必須每次輸入我的密碼。有沒有辦法說只使用配置中指定的密鑰但繼續使用ssh代理? - Drew
@Drew:如果密鑰已加載到代理中,則該命令仍應從代理中提取。你確定你的鑰匙是預裝的嗎?檢查 ssh-add -l 在使用Git主機別名之前。此外,公鑰文件也需要存在 SSH 能識別出那個關鍵 SSH代理 存儲。你可以重生一個迷失 .pub 文件的命令就像 ssh-keygen -f blah -y > blah.pub。 - Chris Johnsen
是的,它在那裡。當我刪除IdentitiesOnly調用時,它會發送github 4個不同的密鑰(包括正確的密鑰,要求密碼短語)。當我添加呼叫時,它只發送一個密鑰,但每次都請求密碼。即使我告訴OSX將密碼短語值存儲在其鑰匙串中。 - Drew


man ssh_config

就像是

Host personal_repo
  User personal
  IdentityFile .ssh/personal_rsa

Host company_repo
  User company
  IdentityFile .ssh/company_rsa

並使用 personal_repo 作為你的git倉庫的東道主。


3
2018-04-18 14:05



塔斯,您能否回顧一下上面的變化?我添加了我的ssh_config和我的git配置。
Host 只是一個標識符 - 不需要完整的域名。這可能會產生一些隱藏的錯誤。如果你改變了,你不需要在你的git配置中拼寫全名。
for gitorious,user = git和host gitorious.org:例如git@gitorious.org:~revelut / qt / bruce-sandbox-qt.git你如何在你的主機中匹配網址的一部分? (通常〜為我瘋狂)
@Tass所以,如果我將名稱company_unfuddle提供給SSH配置,我的URL應該是git @ company_unfuddle:{company} /overall.git? @Bruce--我不確定你在問什麼。你能擴展一點嗎?


IdentityFile和Identities只能很好地工作。困擾我的是必須記住使用不同的主機名連接,以及轉發的代理連接仍然保留所有密鑰的事實,這意味著如果遠程主機被洩露,他們可以在我進入時使用我的任何身份。

我最近開始使用:

https://github.com/ccontavalli/ssh-ident

它是ssh的包裝器,它:

  • 為您定義的每個身份保留一個完全獨立的代理。
  • 自動在登錄會話中共享代理,在.bashrc中無關。
  • 在您第一次需要時按需加載代理和相應的密鑰。
  • 根據ssh命令行(主機名等)或當前工作目錄確定要使用的代理程序。這特別方便,因為我傾向於根據我正在做的事情從不同的路徑工作。

3
2018-03-15 04:20