使用多个SSH公钥


97

我在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配置是否有问题。


你的ssh配置看起来正确,我正在使用类似的配置。
PaŭloEbermann

Answers:


109

如果您有一个活动的ssh-agentid_rsa加载了您的密钥,那么问题可能是ssh首先提供该密钥。Unfuddle可能接受它进行身份验证(例如在sshd中)但拒绝授权访问公司存储库(例如,在他们用于授权的任何内部软件中,可能类似于Gitolite)。也许有一种方法可以将您的个人密钥添加到公司帐户(多个人不共享相同的corp_rsa公钥和私钥文件,是吗?)。


IdentitiesOnly .ssh/config配置关键字可以用于限制钥匙的ssh到远程提供的sshd只是那些通过指定IdentityFile的关键字(即,其将拒绝使用碰巧被加载到一个活性的任何其他键的ssh-agent)。

试试这些.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

7
如果在同一个Unfuddle子域(具有不同的SSH密钥)上有多个帐户,则需要使用第二种方法。
leolobato 2011年

在我的gitolite设置中,IdentitiesOnly对我来说至关重要,谢谢!
科恩

1
很棒,这解决了我的所有密钥被发送到github的问题。但是,OS XI必须每次都输入我的密码。有没有办法说只使用配置中指定的密钥但继续使用ssh代理?
德鲁

1
@Drew:如果密钥已加载到代理程序中,则该命令仍应从代理程序中提取。你确定你的钥匙是预装的吗?ssh-add -l在使用Git主机别名之前检查一下。此外,公钥文件需要存在,以便ssh可以识别ssh-agent存储的密钥。您可以.pub使用类似命令重新生成丢失的文件ssh-keygen -f blah -y > blah.pub
克里斯约翰森2013年

是的,它在那里。当我删除I​​dentitiesOnly调用时,它会发送github 4个不同的密钥(包括正确的密钥,要求密码短语)。当我添加呼叫时,它只发送一个密钥,但每次都要求密码。即使我告诉OSX将密码短语值存储在其钥匙串中。
德鲁

3

man ssh_config

就像是

Host personal_repo
  User personal
  IdentityFile .ssh/personal_rsa

Host company_repo
  User company
  IdentityFile .ssh/company_rsa

personal_repo在git repo中用作主机。


塔斯,您能否回顾一下上面的变化?我添加了我的ssh_config和我的git配置。

Host只是一个标识符 - 不需要完整的域名。这可能会产生一些隐藏的错误。如果你改变了,你不需要在你的git配置中拼写全名。

for gitorious,user = git and host gitorious.org:eg git@gitorious.org:~revelut / qt / bruce-sandbox-qt.git你如何在你的主机中匹配网址的一部分?(通常〜为我疯狂)

@Tass所以,如果我将名称company_unfuddle给SSH配置,我的URL应该是git @ company_unfuddle:{company} /overall.git?@Bruce - 我不确定你在问什么。你能扩展一点吗?

3

IdentityFile和Identities只能很好地工作。困扰我的是必须记住使用不同的主机名连接,以及转发的代理连接仍然保存所有密钥的事实,这意味着如果远程主机被泄露,他们可以在我进入时使用我的任何身份。

我最近开始使用:

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

它是ssh的包装器,它:

  • 为您定义的每个身份保留一个完全独立的代理。
  • 自动在登录会话中共享代理,在.bashrc中无关。
  • 在您第一次需要时按需加载代理和相应的密钥。
  • 根据ssh命令行(主机名等)或当前工作目录确定要使用的代理程序。这特别方便,因为我倾向于根据我正在做的事情从不同的路径工作。

0

如果你想使用ssh代理,这是一个正确的方法:

# Create public keys to make sure they exist
# this is a must if you use ssh agent forwarding
# or want to use ssh-agent at all
ssh-add -L | grep personal > ~/.ssh/personal_identity.pub
ssh-add -L | grep company > ~/.ssh/company_identity.pub


# Add to ~/.ssh/config
Host {personalaccount}.unfuddle.com
  IdentityFile ~/.ssh/personal_identity.pub

Host {companyaccount}.unfuddle.com
  IdentityFile ~/.ssh/company_identity.pub

说明:如果〜/ .ssh目录中有私钥,则不使用ssh-agent。所以我们用另一个名称创建公钥,这样ssh就被迫使用ssh-agent。如果您无法访问私钥(例如ssh代理转发),这也会有所帮助


这可能ssh-add -L不是ssh-agent
艾夫斯

@ives感谢,修复
Vanuan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.